Fragestellung und Ziel der Analyse

Fragestellung:

  • Welche unabhängigen Faktoren aus dem geografischem und demografischem Bereich haben einen wesentlichen Einfluss auf die Impfquote in den unterschiedlichen Wiener Bezirken?
  • Gibt es wesentliche Unterschiede zwischen einem Modell, dass die Erstgeimpftenquote und einem Modell, dass die Vollimmunisierten beschreibt?

Ziel dieser Arbeit ist es zu ermitteln, welche der ausgewählten demografischen Faktoren (Alter, Geschlecht, Einwohnerzahl, Einkommen, Bildung und Politik) und geografischen Faktoren (Impfzentren, Ordinationen, öffentliche Verkehrsanbindungen) einen wesentlichen Einfluss auf die Impfquote darstellen.

Hierzu würden wir in einem Raster der Wiener Gemeindebezirke die Haltestellen der Wiener Linien sowie der Impfstellen darstellen. Ziel soll es sein, die Anzahl der Haltestellen in einem gewissen Radius zu den Impfstellen zu ermitteln. Dadurch kann die Anzahl der Haltestellen in der unmittelbaren Umgebung zu den Impfstellen summiert werden. Die Anzahl der Impfstellen sowie die Anzahl der erwähnten Haltestellen je Bezirk dienen als die zwei geographischen Faktoren und fließen in die Korrelationsbestimmung ein.

Ausgewählte demographischen Faktoren, bestehend aus Bildungsstand, der Geschlechterverteilung, der Altersverteilung sowie die politische Verteilung je Bezirk, sollen nicht in absoluten Zahlen bemessen werden, sondern durch eine prozentuelle Verteilung der jeweiligen Gruppe/Kategorie an der Gesamtheit der Kategie pro Bezirk dargestellt werden.

Deskriptive Statistik

Darstellung der verwendeten Datensätze

Zur Beantwortung der Fragestellung wurden im ersten Schritt alle dafür benötigten Datensätze zusammengetragen. Nachfolgend findet sich eine Aufstellung sowie Beschreibung aller verwendeten Datensätze.

Demographische Datensätze:

Durchschnittliches Nettoeinkommen seit 2002 - Bezirke Wien

Beschreibung Erläuterung
Link: https://www.data.gv.at/katalog/dataset/d76c0e8b-c599-4700-8a88-29d0d87e563d
Format: CSV
Bezeichnung: fin-bez-inc
DISTRICT_CODE: Gemeindebezirkskennzahl, Schema: 9BBZZ, BB=Nummer Bezirk, ZZ=00
SUB_DISTRICT: Zählbezirkskennzahl gemäß Stadt Wien (Schema: 9BBZZ, 9=Kennzeichnung Wien, BB=Nummer Bezirk, ZZ=Nummer Zählbezirk, ZZ=99 bei fehlender Zählbezirkskennzeichnung)
REF_DATE: Referenzdatum
REF_YEAR: Referenzjahr
INC_TOT_VALUE: Durchschnittlicher Jahresnettobezug pro ArbeitnehmerIn (Gesamt)
INC_MAL_VALUE: Durchschnittlicher Jahresnettobezug pro ArbeitnehmerIn (Männer)
INC_FEM_VALUE: Durchschnittlicher Jahresnettobezug pro ArbeitnehmerIn (Frauen)
## Rows: 408 Columns: 1
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## chr (1): NUTS1;NUTS2;NUTS3;DISTRICT_CODE;SUB_DISTRICT_CODE;REF_DATE;REF_YEAR...
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
## # A tibble: 6 x 1
##   `NUTS1;NUTS2;NUTS3;DISTRICT_CODE;SUB_DISTRICT_CODE;REF_DATE;REF_YEAR;INC_TOT_~
##   <chr>                                                                         
## 1 AT1;AT13;AT130;90000;90000;20020101;2002;18.217;NA;NA                         
## 2 AT1;AT13;AT130;90100;90100;20020101;2002;25.463;NA;NA                         
## 3 AT1;AT13;AT130;90200;90200;20020101;2002;16.439;NA;NA                         
## 4 AT1;AT13;AT130;90300;90300;20020101;2002;18.701;NA;NA                         
## 5 AT1;AT13;AT130;90400;90400;20020101;2002;20.325;NA;NA                         
## 6 AT1;AT13;AT130;90500;90500;20020101;2002;16.258;NA;NA

Bildungsstand der Bevölkerung seit 2008 - Bezirke Wien

Beschreibung Erläuterung
Link: https://www.data.gv.at/katalog/dataset/b29308e9-3888-44be-ac2f-8f1515ac0347
Format CSV
Bezeichnung: edu-bez-aka-viz
DISTRICT_CODE: Gemeindebezirkskennzahl, Schema: 9BBZZ, BB=Nummer Bezirk, ZZ=00
SUB_DISTRICT: Zählbezirkskennzahl gemäß Stadt Wien (Schema: 9BBZZ, 9=Kennzeichnung Wien, BB=Nummer Bezirk, ZZ=Nummer Zählbezirk, ZZ=99 bei fehlender Zählbezirkskennzeichnung)
REF_DATE: Referenzdatum
REF_YEAR: Referenzjahr
EDU_ALL Bevölkerung im Alter 25-64 Jahre mit höchster abgeschlossener Schulbildung - Allgemeinbildende Pflichtschule
EDU_LEH: Bevölkerim Alter 25-64 Jahre mit höchster abgeschlossener Schulbildung – Lehre
EDU_BMS: Bevölkerung im Alter 25-64 Jahre mit höchster abgeschlossener Schulbildung - Berufsbildende mittlere Schule
EDU_AHS: Bevölkerung im Alter 25-64 Jahre mit höchster abgeschlossener Schulbildung - Allgemeinbildende höhere Schule
EDU_BHS: Bevölkerung im Alter 25-64 Jahre mit höchster abgeschlossener Schulbildung - Berufsbildende höhere Schule
EDU_KOL: Bevölkerung im Alter 25-64 Jahre mit höchster abgeschlossener Schulbildung – Kolleg
EDU_UNI: Bevölkerung im Alter 25-64 Jahre mit höchster abgeschlossener Schulbildung - Hochschule (Universität und Fachhochschule)
EDU_AKA: Bevölkerung im Alter 25-64 Jahre mit höchster abgeschlossener Schulbildung - AkademikerInnenanteil (Hochschule und Hochschulverwandte Lehranstalten bzw. Akademien)
## Warning: One or more parsing issues, see `problems()` for details
## Rows: 264 Columns: 1
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## chr (1): NUTS1;NUTS2;NUTS3;DISTRICT_CODE;SUB_DISTRICT_CODE;REF_DATE;REF_YEAR...
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
## # A tibble: 6 x 1
##   `NUTS1;NUTS2;NUTS3;DISTRICT_CODE;SUB_DISTRICT_CODE;REF_DATE;REF_YEAR;EDU_ALL;~
##   <chr>                                                                         
## 1 AT1;AT13;AT130;90000;90000;20081031;2008;22,05;26,58;11,84;9,96;8,3;1,02;2,42~
## 2 AT1;AT13;AT130;90000;90000;20091031;2009;22,71;25,76;11,53;9,85;8,11;1,04;2,4~
## 3 AT1;AT13;AT130;90000;90000;20101031;2010;23,04;25,18;11,28;10;8,12;1,02;2,34;~
## 4 AT1;AT13;AT130;90000;90000;20111031;2011;23,17;24,67;11,12;9,9;8,1;0,98;2,35;~
## 5 AT1;AT13;AT130;90000;90000;20121031;2012;23,26;24,01;10,89;9,79;8,13;0,99;2,3~
## 6 AT1;AT13;AT130;90000;90000;20131031;2013;23,77;23,22;10,58;9,73;7,95;0,99;2,2~

Wahlergebnis der Nationalratswahl 2019 auf Ebene der politischen Bezirke Österreichs

Beschreibung Erläuterung
Link: https://www.wahldatenbank.at/
Format: CSV
Bezeichnung: nrw2019
GKZ: Fiktive Gemeindekennziffer, da nicht jede Gemeinde eine eigene Kennziffer hat.
Logik: G + Bundeslandziffer + drei Ziffern für den Bezirk

z.B. Wien 1. Innere Stadt: G90100 Name: | Name des Bezirks Wahlberechtigte: | Anzahl der wahlberechtigten Personen Abgegebenen Anzahl abgegebenen Stimmen Gültig: | Anzahl der gültig abgegebenen Stimmen Ungültig: | Anzahl der ungültig abgegebenen Stimmen Parteienkürzel: | Parteienkürzel in Spaltennamen geben jeweils an wie viele gültige Stimmen die jeweilige Partei gewählt haben. Oevp: ÖVP, spoe: SPÖ, fpoe: FPÖ, gruene: Grünen, neos: NEOS, pilz: Liste Pilz, kpoe: KPÖ, wandl, bpoe, gilt bzoe, slp, cpoe: Restparteien

## Warning: One or more parsing issues, see `problems()` for details
## Rows: 116 Columns: 19
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## chr  (8): GKZ, Name, Wahlberechtigte, bpoe, gilt, bzoe, slp, cpoe
## dbl (11): abgegeben, gültig, ungültig, oevp, spoe, fpoe, gruene, neos, pilz,...
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
## # A tibble: 6 x 19
##   GKZ   Name  Wahlberechtigte abgegeben gültig ungültig  oevp  spoe  fpoe gruene
##   <chr> <chr> <chr>               <dbl>  <dbl>    <dbl> <dbl> <dbl> <dbl>  <dbl>
## 1 G101~ Eise~ 10798                8574   8485       89  3523  1685  1162   1220
## 2 G102~ Rust~ 1594                 1276   1255       21   424   389   239    106
## 3 G103~ Eise~ 34307               28264  27816      448 10317  8572  4327   2478
## 4 G104~ Güss~ 21151               17336  17109      227  7357  4935  2828   1087
## 5 G105~ Jenn~ 14311               11323  11157      166  4526  2669  2366    890
## 6 G106~ Matt~ 31587               25758  25358      400  9000  8008  4230   2222
## # ... with 9 more variables: neos <dbl>, pilz <dbl>, kpoe <dbl>, wandl <dbl>,
## #   bpoe <chr>, gilt <chr>, bzoe <chr>, slp <chr>, cpoe <chr>

Bevölkerung nach Altersgruppen, Geschlecht und Gemeindebezirken 2020

Beschreibung Erläuterung
Link: https://www.wien.gv.at/statistik/bevoelkerung/tabellen/bevoelkerung-alter-geschl-bez.html
Format: html; selbstständig in Excel umgewandelt
Bezeichnung: Bevölkerung nach Altersgruppen, Geschlecht und Gemeindebezirken 2020. Definition von Bevölkerung Personen, die in Wien mit Hauptwohnsitz gemeldet sind (inklusive Obdachlosenmeldungen) und um den Stichtag herum eine ununterbrochene Mindestaufenthaltsdauer von 90 Tagen in Wien aufweisen.
Bezirk: Name des Bezirks
Männer: Jeweils 4 Spalten: 0-18, 19-39, 40-64, 65+ in denen die Gesamtzahl an Männern je Bezirk dargestellt wird, die sich innerhalb der jeweiligen Altersgruppe befinden
Frauen: Jeweils 4 Spalten: 0-18, 19-39, 40-64, 65+ in denen die Gesamtzahl an Frauen je Bezirk dargestellt wird, die sich innerhalb der jeweiligen Altersgruppe befinden
## New names:
## * `` -> ...3
## * `` -> ...4
## * `` -> ...5
## * `` -> ...6
## * `` -> ...7
## * ...
## # A tibble: 6 x 10
##   Bezirk   `Altersgruppen zum~ ...3   ...4  ...5  ...6  ...7  ...8  ...9  ...10 
##   <chr>    <chr>               <chr>  <chr> <chr> <chr> <chr> <chr> <chr> <chr> 
## 1 <NA>     Männer              <NA>   <NA>  <NA>  Frau~ <NA>  <NA>  <NA>  <NA>  
## 2 <NA>     0-18 m              19-39~ 40-6~ 65+ m 0-18~ 19-3~ 40-6~ 65+ w DISTR~
## 3 Wien     179756              309126 3121~ 1312~ 1686~ 3061~ 3198~ 1842~ <NA>  
## 4 1. Inne~ 1039                1982   2918  1840  1030  2104  2828  2306  90100 
## 5 2. Leop~ 9967                18770  16971 6543  9195  18501 16741 9160  90200 
## 6 3. Land~ 7396                16038  14794 6206  7012  15871 15490 8873  90300

Durchschnittsalter der Bevölkerung seit 2002

Beschreibung Erläuterung
Link: https://www.wien.gv.at/statistik/bezirke/
Format Excel
Bezeichnung pop-bez-age
DISTRICT_CODE: Gemeindebezirkskennzahl, Schema: 9BBZZ, BB=Nummer Bezirk, ZZ=00
SUB_DISTRICT: Zählbezirkskennzahl gemäß Stadt Wien (Schema: 9BBZZ, 9=Kennzeichnung Wien, BB=Nummer Bezirk, ZZ=Nummer Zählbezirk, ZZ=99 bei fehlender Zählbezirkskennzeichnung)
REF_DATE: Referenzdatum
REF_YEAR: Referenzjahr
AGE_AVE: Durchschnittliches Alter der Bevölkerung je Bezirk pro Jahr

Geographische Faktoren:

Haltestellenpunkte des öffentlichen Verkehrsnetzes von Wien

Beschreibung Erläuterung
Link: https://www.data.gv.at/katalog/dataset/stadt-wien_ffentlichesverkehrsnetzhaltestellenpunktewien/resource/74b39fdd-50dc-4917-91ad-777cd6f15aec
Format SHP im Ordner und als CSV
Bezeichnung OEFFHALTESTOGD
SHAPE POINT (Längengrad, Breitengrad)
HTXT Bezeichnung der Haltestelle
HTXTK Bezeichnung der Haltestelle – Kurztext
HLINIEN Liste der an der Haltestelle haltenden Linien z.B. Reumannplatz: U1, Freiheitsplatz: 501, 510 Siebeckstraße: VAL3

Bezirksgrenzen von Wien

Beschreibung Erläuterung
Link: https://www.data.gv.at/katalog/dataset/stadt-wien_bezirksgrenzenwien/resource/f1540ea4-edd4-42f5-9b39-2cbba97fea36
Format SHP im Ordner
Bezeichnung BEZIRKSGRENZEOGD
SHAPE POLYGON
Name Name des Bezirks
BEZNR Bezirksnummer
NAMEK_NUM Bezirksnummer und Name des Bezirks
DISTRICT_C Postleizahl
FLAECHE Fläche in m²
Geometry Geographische Koordinaten zur Darstellung des Rasters der Wiener Bezirke

Daten zur Impfinzidenz in Wien

COVID-19 Schutzimpfungen – Impfungen in Gemeinden

Beschreibung Erläuterung
Link: https://www.data.gv.at/katalog/dataset/covid-19-schutzimpfungen-impfungen-in-gemeinden/resource/89ad8077-0318-4dfb-953f-0824754b5adc
Format CSV
Bezeichnung impfungen-gemeinden
Gemeindecode Postleizahl
Bevölkerung Anzahl der Bevölkerung je Gemeinde
Teilgeimpfte Anzahl der Personen mit einer Impfung
TeilgeimpftePro100 Anzahl der Personen mit einer Impfung von 100 Personen
Vollimmunisierte Anzahl der Personen die vollimmunisiert sind
VollimmunisiertePro100 Anzahl der Personen die vollimmunisiert sind von 100 Personen
## Rows: 2117 Columns: 1
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## chr (1): Datum;Gemeindecode;Bevölkerung;Teilgeimpfte;TeilgeimpftePro100;Voll...
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
## # A tibble: 6 x 1
##   `Datum;Gemeindecode;Bevölkerung;Teilgeimpfte;TeilgeimpftePro100;Vollimmunisie~
##   <chr>                                                                         
## 1 2021-11-19T23:59:59+01:00;10101;14895;11179;75.05203088;10629;71.35951662     
## 2 2021-11-19T23:59:59+01:00;10201;2000;1533;76.65;1454;72.7                     
## 3 2021-11-19T23:59:59+01:00;10301;1883;1457;77.37652682;1410;74.88050982        
## 4 2021-11-19T23:59:59+01:00;10302;1841;1436;78.00108637;1389;75.44812602        
## 5 2021-11-19T23:59:59+01:00;10303;2122;1621;76.39019793;1555;73.2799246         
## 6 2021-11-19T23:59:59+01:00;10304;3176;2386;75.12594458;2285;71.94584383

Datensätze mit Standorten, wo Covid-Impfstoffe verabreicht werden

Im Zusammenhang mit den nachfolgenden Datensätzen, die die Adressen der jeweiligen Impfzentren und Ordinationen beinhalten, ist hervorzuheben, dass der ursprünglich herangezogene Datensatz mit der Bezeichnung “IMPFSTELLEOGD” von data.gv nicht die Covid-19-Impfzentren, sondern nur jene Impfstandorte in Wien darstellt, wo Personen generell Impfungen erhalten können.

Nach Feststellung des Fehlers und der Realisation, dass weder data.gv noch andere Datenanbieter die Lokalisationen der Impfzentren in Wien in standardardisierter Form zur Verfügung stellt, musste Notgedrungen die Datenerhebung selbstständig vorgenommen werden.

Wie nachfolgend näher beschrieben ist, wurden die Adressen der Impfzentren in Wien von der offiziellen Webseite der Stadt Wien erhoben und in einem Excel-Dokument erfasst.

Impfstandorte in Wien laut Webseite der Stadt Wien

Beschreibung Erläuterung
Link: https://impfservice.wien/corona/ https://coronavirus.wien.gv.at/impfen-ohne-termin/
Format Excel
Bezeichnung Impfzentren_Covid19_Wien
Anmerkung: Da kein Datensatz mit aktuellen Impfzentren für Covid-19 verfügbar waren, wurden die Standorte samt Bezeichnung selbstständig gesammelt und in einem Excel-File erfasst. Mittels R-Packages tidygeocoder wurden die Koordinaten zu den jeweiligen Standorten automatisiert abgefragt und in den Spalten latitude und longitude dargestellt .
Impfstellen_Typ: Selbstständig vergebene Kategorisierung der Impfstandorte nach Typen
Impfzentrum: größere Impfstandorte wie z.B. Austria-Center-Vienna
Supermarkt: Impfstandort bei einem Supermarkt
Sehenswürdigkeit: Impfstandort bei einer Sehenswürdigkeit
Impfbox: Impfstandort in einer sogenannten Impfbox. Also Impfung in einem Container mit nur limitierten Kapazitäten.
Einkaufszentrum: Impfstandort in einem Einkaufszentrum
Name Bezeichnung des Impfstandorts
Straße Straße des Impfstandorts
Latitude Breitengrad des Standorts
Longitute Längengrad des Standorts
## # A tibble: 6 x 10
##   Nummer Impfstellen_Typ Name     Strasse   Zusatzinfo    PLZ Bezirk  location  
##    <dbl> <chr>           <chr>    <chr>     <chr>       <dbl> <chr>   <chr>     
## 1      1 Impfzentrum     Karmeli~ Karmelit~ 1. Stock     1020 Leopol~ Karmelite~
## 2      2 Impfzentrum     TownTown Thomas-K~ 2            1030 Landst~ Thomas-Kl~
## 3      3 Impfzentrum     Gesundh~ Wienerbe~ <NA>         1100 Favori~ Wienerber~
## 4      4 Impfzentrum     Am Schö~ Am Schöp~ 11/R10       1120 Meidli~ Am Schöpf~
## 5      5 Impfzentrum     Gasgasse Gasgasse~ Eingang: S~  1150 Rudolf~ Gasgasse ~
## 6      6 Impfzentrum     Martins~ Martinst~ 1. Stock     1180 Währing Martinstr~
## # ... with 2 more variables: longitude <dbl>, latitude <dbl>

Offizielle Liste der Covid-19-Impfordinationen vom 25. November 2021 der Ärztekammer für Wien

Auch beim nachfolgenden Datensatz musste ein alternativer Weg zur Datenerhebung angewandt werden. Mittels Internetrecherche wurde ein PDF-Dokument der Ärztekammer Wien entdeckt, dass zum Stand 25. November 2021 sämtliche Privatordinationen in Wien mit Name und Adresse auflistet. Durch Verwendung eines PDF zu Excel-Converters konnte der Datensatz in eine für R lesbare Struktur gebracht werden.

Beschreibung Erläuterung
Link: https://www.aekwien.at/documents/263869/1017607/210805_Liste+der+offiziellen+Covid-19-Impfordinationen.pdf/fb17eb2b-5bae-9e76-178e-da27498d1309

Bezeichnung des Dokuments: Excel: impf_ordinationen_lat_long. xlsx PDF: | Liste der offiziellen Covid-19-Impfordinationen_WIEN Format | PDF – selbstständig in Excel umgewandelt FACH | Praxis mit Schwerpunkt auf …. Z.B. innere Medizin, Allgemeinmedizin oder HNO… Titel | Titel des behandelnden Doktors Name | Nachname des Doktors Vorname | Vorname des Doktors PLZ | Postleizahl Ordinationsadresse | Adresse der Ordination Tel.nr. | Telefonnummer der Ordination

## # A tibble: 6 x 14
##   ï..Fach    Titel   Name   Vorname   PLZ Ordinationsadre~ Tel.nr. Details X    
##   <chr>      <chr>   <chr>  <chr>   <dbl> <chr>            <chr>   <chr>   <lgl>
## 1 Allgemein~ Assoc.~ Bohdj~ Arthur   1010 Kärntner Strass~ 890-40~ <NA>    NA   
## 2 Innere Me~ Priv.D~ Kikic  Zeljko   1010 Rathausstrasse ~ 470-61~ <NA>    NA   
## 3 Neurologi~ Dr.     Litta~ Gabor    1010 Sonnenfelsgasse~ 0660/8~ <NA>    NA   
## 4 Plastisch~ Dr.     Milani Shirin   1010 Schottengasse 7~ 236 13~ <NA>    NA   
## 5 Urologie   Univ.P~ Shari~ Shahro~  1010 Rathausstrasse ~ 470 61~ <NA>    NA   
## 6 Allgemein~ Dr.     Brandl Rainer   1020 Grosse Pfarrgas~ 890 24~ <NA>    NA   
## # ... with 5 more variables: PLZ_Adresse <chr>, location <chr>, lat_long <lgl>,
## #   lat <dbl>, longitude <dbl>

Funktion zur Erstellung der Säulendiagramme

Function_Säulendiagramm <- function(Bevoelkerung_df, method_df) {
  #Verteilung zuerst festlegen
  Verteilung_df = c()
  for (x in colnames(Bevoelkerung_df)) {
    Verteilung_df <- append(Verteilung_df, Bevoelkerung_df[[x]])
  }
  
  #Die Gruppen zu den Verteilungen ermitteln
  Gruppe_df = c()
  for (x in colnames(Bevoelkerung_df)) {
    Gruppe_df <- append(Gruppe_df, rep(x, nrow(Bevoelkerung_df)))
  }
  
  #Dataframe ummodellieren um Plotten mit GGPLOT zu ermöglichen, da bereits aggreggierte Daten
  
  Bevoelkerung_Verteilung_ggp <- data.frame(Bezirk = rownames(Bevoelkerung_df),
                                                  Verteilung = Verteilung_df,
                                                  Gruppe = Gruppe_df)
  
  #Levels herausholen zur erfolgreichen Sortierung
  levelsBezirk <- c(rownames(Bevoelkerung_df))
  levelsGruppe <- c(colnames(Bevoelkerung_df))
  
  #Factorlevel zuweisen, um richtige Sortierung zu garantieren
  Bevoelkerung_Verteilung_ggp$Bezirk <- fct_rev(factor(Bevoelkerung_Verteilung_ggp$Bezirk, levels = levelsBezirk))
  Bevoelkerung_Verteilung_ggp$Gruppe <- fct_rev(factor(Bevoelkerung_Verteilung_ggp$Gruppe, levels = levelsGruppe))
  
  #Plot zeichnen
  plot_df <- ggplot(Bevoelkerung_Verteilung_ggp, aes(x = Bezirk, y = Verteilung, group = Gruppe, fill = Gruppe))
  plot_df <- plot_df + geom_bar(position = method_df, stat = "identity") + coord_flip()
  plot_df
}

Bevölkerungsanzahl pro Bezirk

Das durchschnittliche Bevölkerungsaufkommen pro Bezirk beträgt 83.520 Einwohner. Der Großteil der Bezirke schwankt zwischen dem ersten Quantil von 46.570 Einwohnern und dem dritten Quantil von 103.751 Einwohnern.

Bevoelkerung_Anzahl <- readRDS(file = "Bevoelkerung.rds")
summary(Bevoelkerung_Anzahl)
##   Bevölkerung    
##  Min.   : 15867  
##  1st Qu.: 46570  
##  Median : 76137  
##  Mean   : 83520  
##  3rd Qu.:103751  
##  Max.   :210573
boxplot(Bevoelkerung_Anzahl)

Das Minimum von 15.867 Einwohner liegt im 1. Bezirk, und das Maximum von 210.573 Einwohner im 10. Bezirk.

Function_Säulendiagramm(Bevoelkerung_Anzahl, "dodge")

Durchschnittsalter pro Bezirk

Das Durchschnittsalter beträgt 41,49 Jahre und liegt sehr nahe am Median (41,01). Das erste (40,29) und das dritte Quantil (41,94) befinden sich im Nahen Umfeld des Medians und somit lässt sich vermuten, dass es keinen signifikanten Unterschied zwischen den einzelnen Bezirken im Bezug auf das Alter gibt.

Durchschnittsalter <- readRDS(file = "Durchschnittsalter.rds")
summary(Durchschnittsalter)
##  Durchschnitt_Alter
##  Min.   :39.29     
##  1st Qu.:40.29     
##  Median :41.01     
##  Mean   :41.49     
##  3rd Qu.:41.94     
##  Max.   :47.45
boxplot(Durchschnittsalter)

Lediglich zwei kleine Ausreißer mit erhöhtem Alter gibt es im 1. Bezirk (47,45) und im 13. Bezirk. Das Minimum liegt 11. Bezirk bei 39,29 Jahren.

Function_Säulendiagramm(Durchschnittsalter, "dodge")

Bevölkerung nach Alter und Geschlecht

Die Daten repräsentieren einen prozentuellen Anteil an der Grundgesamtheit. Die Altersgruppen 19-39m, 40-64w, 19-39w, 40-64w am häufigsten vertreten. Dies lässt sich voraussichtlich darauf zurückführen, dass diese Altersgruppen das berufsfähiges Alter repräsentieren und viele Unternehmen in Wien angesiedelt sind. 0-18m sind minimal öfter vertreten als 0-18w und 65+w sind häufiger vertreten als 65+m.

Bevoelkerung_Alter_Geschlecht <- readRDS(file = "Bevoelkerung_Alter_Geschlecht.rds")
summary(Bevoelkerung_Alter_Geschlecht)
##      0-18 m          19-39 m         40-64 m          65+ m       
##  Min.   : 6.436   Min.   :12.35   Min.   :14.53   Min.   : 5.785  
##  1st Qu.: 7.496   1st Qu.:14.50   1st Qu.:16.00   1st Qu.: 6.316  
##  Median : 9.012   Median :17.07   Median :16.45   Median : 6.593  
##  Mean   : 8.680   Mean   :16.62   Mean   :16.31   Mean   : 7.063  
##  3rd Qu.: 9.446   3rd Qu.:18.42   3rd Qu.:16.67   3rd Qu.: 7.125  
##  Max.   :11.012   Max.   :20.67   Max.   :18.18   Max.   :11.466  
##      0-18 w          19-39 w         40-64 w          65+ w       
##  Min.   : 5.946   Min.   :12.80   Min.   :15.44   Min.   : 7.747  
##  1st Qu.: 7.230   1st Qu.:14.68   1st Qu.:15.85   1st Qu.: 8.829  
##  Median : 8.364   Median :16.79   Median :16.52   Median : 9.353  
##  Mean   : 8.179   Mean   :16.62   Mean   :16.62   Mean   : 9.910  
##  3rd Qu.: 8.813   3rd Qu.:17.93   3rd Qu.:17.21   3rd Qu.:10.308  
##  Max.   :10.354   Max.   :21.25   Max.   :18.16   Max.   :14.370

Wie bereits vorher ist der Altersdurchschnitt im Bezirk Simmering niedriger als in anderen Bezirken und im ersten Bezirk ein relativ hoher Altersschnitt zu finden.

Function_Säulendiagramm(Bevoelkerung_Alter_Geschlecht, "fill")

Bevölkerung nach Geschlecht

Die Daten repräsentieren einen prozentuellen Anteil an der Grundgesamtheit. Hier lässt sich erkennen, dass die Frauenquote (51.32%) der Männerquote (48.68%) im Schnitt überwiegt.

Bevoelkerung_Geschlecht <- readRDS(file = "Bevoelkerung_Geschlecht.rds")
summary(Bevoelkerung_Geschlecht)
##        m               w        
##  Min.   :46.71   Min.   :49.38  
##  1st Qu.:48.21   1st Qu.:50.65  
##  Median :48.56   Median :51.44  
##  Mean   :48.68   Mean   :51.32  
##  3rd Qu.:49.35   3rd Qu.:51.79  
##  Max.   :50.62   Max.   :53.29

Eine besonders erhöhte Frauenquote ist in den Bezirken 18. Währing, 19. Döbling, und 13. Hietzing vorzufinden.

Function_Säulendiagramm(Bevoelkerung_Geschlecht, "fill")

Bevölkerung nach Alter

Die Daten repräsentieren einen prozentuellen Anteil an der Grundgesamtheit. Die Altersgruppen 19-64 sind am häufigsten vertreten, wobei 0-18 und 65+ im Durchschnitt gleich viel vertreten sind.

Bevoelkerung_Alter <- readRDS(file = "Bevoelkerung_Alter.rds")
summary(Bevoelkerung_Alter)
##       0-18           19-39           40-64            65+       
##  Min.   :12.38   Min.   :25.35   Min.   :29.97   Min.   :13.53  
##  1st Qu.:14.73   1st Qu.:29.03   1st Qu.:32.35   1st Qu.:15.22  
##  Median :17.43   Median :33.63   Median :32.78   Median :15.81  
##  Mean   :16.86   Mean   :33.24   Mean   :32.93   Mean   :16.97  
##  3rd Qu.:18.25   3rd Qu.:36.37   3rd Qu.:33.35   3rd Qu.:17.42  
##  Max.   :21.37   Max.   :41.32   Max.   :35.81   Max.   :25.84

Würde man die Gruppe <39 als die jüngere Gruppe definieren, würde man ein erhöhtes Aufkommen davon in den Bezirken 2. Leopoldstadt, 5. Margareten und 9. Alsergrund vorfinden.

Function_Säulendiagramm(Bevoelkerung_Alter, "fill")

Bevölkerung nach höchstem Abschluss

Die Daten repräsentieren einen prozentuellen Anteil an der Grundgesamtheit. Durchschnittlich höchster Bildungsabschluss stellt die Universität mit einer Quote von 30.99% dar. Die Pflichtschule (18,95%) und die Lehre (18,96%) sind am zweithäufigsten vertreten.

Bevoelkerung_Abschluss <- readRDS(file = "Education.rds")
summary(Bevoelkerung_Abschluss)
##  Pflichtschule       Lehre            BMS              AHS       
##  Min.   : 8.65   Min.   : 9.51   Min.   : 6.070   Min.   : 8.68  
##  1st Qu.:12.80   1st Qu.:13.17   1st Qu.: 7.065   1st Qu.:10.52  
##  Median :18.35   Median :18.62   Median : 8.260   Median :11.70  
##  Mean   :18.95   Mean   :18.96   Mean   : 8.646   Mean   :12.13  
##  3rd Qu.:25.08   3rd Qu.:23.01   3rd Qu.: 9.535   3rd Qu.:13.96  
##  Max.   :32.75   Max.   :30.68   Max.   :12.830   Max.   :15.70  
##       BHS            Kolleg         Akademie      Universität   
##  Min.   :6.280   Min.   :0.710   Min.   :1.220   Min.   :12.10  
##  1st Qu.:6.875   1st Qu.:0.915   1st Qu.:1.660   1st Qu.:20.38  
##  Median :7.190   Median :1.130   Median :1.910   Median :31.18  
##  Mean   :7.386   Mean   :1.050   Mean   :1.873   Mean   :30.99  
##  3rd Qu.:7.635   3rd Qu.:1.180   3rd Qu.:2.080   3rd Qu.:42.53  
##  Max.   :9.770   Max.   :1.330   Max.   :2.570   Max.   :48.52

Universität, Akademie und Kolleg gruppiert als hoher Bildungsgrad würde ein erhöhtes Vorkommen in den Bezirken 1. Innere Stadt, 7. Neubau, 8. Josefstadt, 9. Alsergrund, 13. Hietzing, 18. Währing und 19. Döbling vorweisen.

Würden Lehre und Pflichtschule gemeinsam einen eher geringer Bildungsstand darstellen, wäre ein erhöhter Anteil in den Bezirken 10. Favoriten, 11. Simmering, 12. Meidling, 20. Brigittenau und 21. Floridsdorf vorzufinden.

Function_Säulendiagramm(Bevoelkerung_Abschluss, "fill")

Bevölkerung nach politischen Wahlen

Die Daten repräsentieren einen prozentuellen Anteil an der Grundgesamtheit. Die Mehrheit hat im Schnitt bei der letzten Nationalratswahl 2019 die ÖVP und SPÖ (ca. 25% jeweils) gewählt, gefolgt von den Grünen (ca. 23%) und danach FPÖ und Neos (ca. 11% jeweils).

Bevoelkerung_Politik <- readRDS(file = "Politik.rds")
summary(Bevoelkerung_Politik)
##       ÖVP             SPÖ             FPÖ             GRÜNE      
##  Min.   :17.88   Min.   :16.59   Min.   : 5.738   Min.   :10.99  
##  1st Qu.:20.93   1st Qu.:20.01   1st Qu.: 7.448   1st Qu.:18.21  
##  Median :23.36   Median :24.78   Median : 9.638   Median :24.53  
##  Mean   :24.15   Mean   :25.02   Mean   :10.885   Mean   :23.48  
##  3rd Qu.:26.04   3rd Qu.:29.02   3rd Qu.:13.160   3rd Qu.:29.48  
##  Max.   :36.53   Max.   :36.44   Max.   :20.507   Max.   :37.37  
##       NEOS             Pilz            KPÖ             Wandl       
##  Min.   : 5.870   Min.   :2.428   Min.   :0.4017   Min.   :0.2901  
##  1st Qu.: 8.025   1st Qu.:2.827   1st Qu.:0.6383   1st Qu.:0.4809  
##  Median :10.421   Median :2.989   Median :0.8032   Median :0.5259  
##  Mean   :10.837   Mean   :3.085   Mean   :0.8077   Mean   :0.5329  
##  3rd Qu.:13.835   3rd Qu.:3.332   3rd Qu.:0.9799   3rd Qu.:0.6069  
##  Max.   :16.657   Max.   :4.279   Max.   :1.1665   Max.   :0.7587  
##       BPÖ        
##  Min.   :0.2350  
##  1st Qu.:0.3678  
##  Median :0.5088  
##  Mean   :0.5129  
##  3rd Qu.:0.6063  
##  Max.   :0.9223

Besondere Auffälligkeiten sind in folgenden Bezirken zu finden:

    1. Innere Stadt mit dem höchsten ÖVP Wert von 36% und dem höchsten NEOS Wert von 17%
    1. Favoriten mit dem höchsten SPÖ Wert von 36%
    1. Simmering mit dem höchsten FPÖ Wert von 21%
    1. Neubau mit dem höchsten Grüne Wert von 37%
Function_Säulendiagramm(Bevoelkerung_Politik, "fill")

Bevölkerung nach Einkommen

Das durchschnittliches Jahreseinkommen liegt im Mittel bei ca. €24k, bei Männern bei ca. €27k und bei Frauen bei ca. €21k. Bei Männern ist eine höhere Reichweite (max - min) vorzufinden als bei Frauen, wobei es einen großen Außreiser beim Gehalt der Männer im ersten Bezirk gibt (ca. €40k).

Bevoelkerung_Einkommen <- readRDS(file = "Einkommen.rds")
summary(Bevoelkerung_Einkommen)
##  Einkommen_Total Einkommen_Männer Einkommen_Frauen
##  Min.   :18528   Min.   :19391    Min.   :17471   
##  1st Qu.:21387   1st Qu.:23099    1st Qu.:19441   
##  Median :23971   Median :26577    Median :21325   
##  Mean   :23916   Mean   :26679    Mean   :21040   
##  3rd Qu.:25601   3rd Qu.:29028    3rd Qu.:22285   
##  Max.   :33256   Max.   :39889    Max.   :26266

Ein hohes Gehalt ist tendenziell in folgenden Bezirken vorzufinden:

    1. Innere Stadt
    1. Hietzing
    1. Währing
    1. Döbling

Ein niedriges Gehalt ist tendenziell in folgenden Bezirken vorzufinden:

    1. Margareten
    1. Favoriten
    1. Simmering
    1. Meidling
    1. Rudolfsheim
    1. Brigittenau
Function_Säulendiagramm(Bevoelkerung_Einkommen, "dodge")

Impfzentren pro Bezirk

Die Daten repräsentieren einen prozentuellen Anteil an der Grundgesamtheit. Durchschnittlich hat jeder Bezirk 4% Anteil an den Impfstellen, wobei es Bezirke gibt mit sehr wenig Impfstellen und Bezirke in denen ein Großteil der Impfstellen angesiedelt sind.

Anmerkung: Es werden die Haltestellen aufsummiert, die ein Impfzentrum bzw. eine Ordination im Umkreis von 500m zur Station vorweist. Also in Wirklichkeit repräsentieren die Zahlen die prozentuelle Anzahl an Haltestellen an der Grundgesamtheit, die eine Impfstelle im Umkreis von 500m vorweist. Dies soll eine gerechtere Abgrenzung zwischen den Bezirken ermöglichen. Das bedeutet auch, dass eine Doppelt- oder Mehrfachzählung einer Impfstelle möglich ist.

Impfstellen_pro_Bezirk <- readRDS(file = "Impfstellen.rds")
summary(Impfstellen_pro_Bezirk)
##  Impfzentren_pro_Bez_Proz Ordination_pro_Bez_Proz
##  Min.   : 0.000           Min.   : 1.708         
##  1st Qu.: 1.557           1st Qu.: 3.277         
##  Median : 2.787           Median : 3.856         
##  Mean   : 4.348           Mean   : 4.348         
##  3rd Qu.: 6.148           3rd Qu.: 4.985         
##  Max.   :17.377           Max.   :11.815
Bevoelkerung_df <- as.matrix(t(Impfstellen_pro_Bezirk))

Folgende Bezirke weisen eine hohe Anzahl an Impfzentren aus: - 23. Liesing - 14% - 9. Alsergrund - 17% - 21. Floridsdorf - 12%

#Plot zeichnen
plot_df <- ggplot(Bevoelkerung_Verteilung_ggp_Impfzentren, aes(x = "", y = Verteilung, group = Gruppe, fill = Bezirk))
plot_df <- plot_df + geom_bar(stat = "identity", color = "black") + coord_polar("y", start=0) + theme_void() + geom_text(aes(y = Verteilung, label = Verteilung, x = 1.4), position = position_stack(vjust = 0.5), size = 3.5, show.legend = FALSE)
plot_df

Ordinationen pro Bezirk

Folgende Bezirke weisen eine hohe Anzahl an Ordinationen aus:

    1. Alsergrund - 12%
    1. Hietzing - 7%
#Plot zeichnen
plot_df <- ggplot(Bevoelkerung_Verteilung_ggp_Ordination, aes(x = "", y = Verteilung, group = Gruppe, fill = Bezirk))
plot_df <- plot_df + geom_bar(stat = "identity", color = "black") + coord_polar("y", start=0) + theme_void() + geom_text(aes(y = Verteilung, label = Verteilung, x = 1.4), position = position_stack(vjust = 0.5), size = 3.5, show.legend = FALSE)
plot_df

Bevölkerung nach Impfstatus (Nov 2021)

69% haben im Durchschnitt die erste Imfpung erhalten, wobei der maximale Wert bei 74% liegt und der minimale bei 64%.

65% sind im Durchschnitt vollimmunisiert, wobei der maximale Wert bei 70% liegt und der minimale bei 57%

Bevoelkerung_Impfung <- readRDS(file = "Impfungen.rds")
summary(Bevoelkerung_Impfung)
##  TeilgeimpftePro100 VollimmunisiertePro100
##  Min.   :63.54      Min.   :57.18         
##  1st Qu.:66.70      1st Qu.:61.30         
##  Median :70.62      Median :66.18         
##  Mean   :69.43      Mean   :64.64         
##  3rd Qu.:71.87      3rd Qu.:68.19         
##  Max.   :73.96      Max.   :70.07

Folgende Bezirke weisen eine hohe Impfquote auf:

    1. Mariahilf
    1. Neubau
    1. Josefstadt
    1. Alsergrund
    1. Hietzing
    1. Währing
    1. Döbling
    1. Donaustadt
    1. Liesing

Folgende Bezirke weisen eine niedrige Impfquote auf:

    1. Favoriten
    1. Simmering
    1. Meidling
    1. Rudolfsheim
    1. Ottakring
    1. Brigittenau
Function_Säulendiagramm(Bevoelkerung_Impfung, "dodge")

Verknüpfung der räumlichen Daten

Aufbereitung der Datensätze mit den Impfstandorten Wiens

Um die Fragestellung zu bearbeiten, mussten im ersten Schritt die vorliegenden Datensätze für die Anforderungen adaptiert werden. Sowohl Impfzentren_Covid19_Wien als auch impf_ordinationen_lat_long enthielten in ihrer ursprünglichen Form ausschließlich die Standortadressen, die jedoch alleine nicht ausreichend sind, um diese als geographische Punkte auf einer Karte darzustellen.

Wie im nachfolgenden Codebeispiel verdeutlicht wird, wurde für den Datensatz impfzentren zunächst eine neue Spalte erzeugt, die die Adresse in einer für die Library tidygeocoder lesbare Form bringt. Dieses Package fordert, dass die Adresse folgendermaßen aussieht: Adresse, Hausnummer, Stadt, Bundesland

Dies wurde durch die paste0-Funktion erzeugt. Die Variable wurde anschließend in eine Vektor-Variable und dann in eine tibble-Variable umgewandelt.

Die nun entscheidende Tätigkeit erfolgt durch die Funktion geocode. Diese dient dazu in die Variable census_impfort den jeweiligen Längen- und Breitengrad der Adresse einzufügen. Als Methode wurde “opencage” gewählt, hierbei handelt es sich um einen Geocoding-API-Anbieter, wo wir einen Trial-Account eröffnet haben und somit in der Lage waren bis zu 2.500 Adressen pro Tag abzufragen. Dieser Geocoding-API-Anbieter wurde deswegen gewählt, da er im Vergleich zu anderen Anbietern die exaktesten Koordinaten (zum einem Preis von 0,00 €) lieferte. Wesentlich hierzu ist die Anwendung der Funktion Sys.setenv, die dazu diente den API-Key an opencage mitzuteilen, damit die Abfrage überhaupt durchgeführt werden kann.

Schlussendlich wurden die erhaltenen Längen- und Breitengrade in entsprechende neue Spalten in den Datensatz eingefügt.

# Benötigte Libraries: 
library(tibble)
library(dplyr)
library(tidygeocoder)

# Variable "location" mit angepasster Adresse 
# für Package library(tidygeocoder) nur lesbar, wenn folgende Angaben enthalten sind: 
# Adresse Hausnummer, Stadt, Bundesland --> daher 
# Karlsplatz 1, Wien, Wien
impfzentren_v2<-impfzentren %>% 
  mutate(location = paste0(Strasse, ", ", "Wien", ", " , "Wien"))


# locations in einen Vektor umwandeln 
bvector <- as.vector(impfzentren_v2$location)
address_s <- tibble(singlelineaddress = bvector)


Sys.setenv(OPENCAGE_KEY="61635a87c8f747f6b18b302966a37678")
Sys.getenv("OPENCAGE_KEY")
# address_single
census_impfort <- address_s %>%
  geocode(address = singlelineaddress, method = "opencage", verbose = TRUE)
census_impfort$lat

# import der ermittelten Längen, Breitengrade in den Datensatz
impfzentren_v2$longitude<-census_impfort$long
impfzentren_v2$latitude<-census_impfort$lat

Das oben veranschaulichte Beispiel wurde im nahezu gleichen Verfahren auch für den Datensatz impf_ordinationen angewendet.

# Hinzufügen von Stadt und Bundesland in eine eigene Spalte = Variable, damit diese von Library gelesen werden kann 
impf_ordinationen_v5<-impf_ordinationen_v5 %>% 
  mutate(location = paste0(PLZ_Adresse, ", ", "Wien", ", " , "Wien"))

# locations in einen Vektor umwandeln 
avector <- as.vector(impf_ordinationen_v5$location)

address_single <- tibble(singlelineaddress = avector)

Sys.setenv(OPENCAGE_KEY="61635a87c8f747f6b18b302966a37678")
Sys.getenv("OPENCAGE_KEY")
# jetzt öffnet sich .Renviron file - dort folgendes eingeben:
# , OPENCAGE_KEY="61635a87c8f747f6b18b302966a37678"
# address_single
census_s1 <- address_single %>%
  geocode(address = singlelineaddress, method = "opencage", verbose = TRUE)

# https://opencagedata.com/dashboard#geocoding
# also 2.500 Abfragen pro Tag machen - das sollte reichen 
# Project: Project 61635A
# Key API: 61635a87c8f747f6b18b302966a37678

# verwendung der Doku von Crane
# https://cran.r-project.org/web/packages/tidygeocoder/tidygeocoder.pdf
# key in OPENCAGE_KEY speichern 


# Alternativer Geocoding-API-Anbieter
Sys.setenv(OPENCAGE_KEY="61635a87c8f747f6b18b302966a37678")
Sys.getenv("OPENCAGE_KEY")
# jetzt öffnet sich .Renviron file - dort folgendes eingeben:
# , OPENCAGE_KEY="61635a87c8f747f6b18b302966a37678"
# address_single
census_opencage <- address_single %>%
  geocode(address = singlelineaddress, method = "opencage", verbose = TRUE)
census_opencage

# Vergleich der Koordinatengenauigkeit zwischen opencage und mapquest
# beide zeigen leichte Abweichungen im Vergleich zu Google Maps
# opencage scheint allerdings ein wenig genauer zu sein 


# Latitude Ergebnis Mapquest: 48.20735 48.20972
# Long Ergebnis Mapquest: 16.37188 16.37583
# Kärtner Straße 7 lt. Google: Kärtner Straße 9
# Sonnenfelsgasse 5 --> Sonnenfelsgasse 5

# Latitude Ergebnis opencage: 48.20744 48.20973
# Long Ergebnis opencage: 16.37186 16.37577
# Kärtner Straße 7 lt. Google: Kärtner Straße 7
# Sonnenfelsgasse 5 --> Sonnenfelsgasse 3


# api key= Ctu8YmtO5Uw55RlZXYKIGClfE8U5L1NG
# https://developer.mapquest.com/user/me/profile
Sys.setenv(MAPQUEST_API_KEY="Ctu8YmtO5Uw55RlZXYKIGClfE8U5L1NG")
Sys.getenv("MAPQUEST_API_KEY")
census_s1 <- address_single %>%
  geocode(address = singlelineaddress, method = "mapquest", verbose = TRUE)

Darstellung der Datensätze mit den Standorten der Impfzentren und Ordinationen

## # A tibble: 6 x 10
##   Nummer Impfstellen_Typ Name     Strasse   Zusatzinfo    PLZ Bezirk  location  
##    <dbl> <chr>           <chr>    <chr>     <chr>       <dbl> <chr>   <chr>     
## 1      1 Impfzentrum     Karmeli~ Karmelit~ 1. Stock     1020 Leopol~ Karmelite~
## 2      2 Impfzentrum     TownTown Thomas-K~ 2            1030 Landst~ Thomas-Kl~
## 3      3 Impfzentrum     Gesundh~ Wienerbe~ <NA>         1100 Favori~ Wienerber~
## 4      4 Impfzentrum     Am Schö~ Am Schöp~ 11/R10       1120 Meidli~ Am Schöpf~
## 5      5 Impfzentrum     Gasgasse Gasgasse~ Eingang: S~  1150 Rudolf~ Gasgasse ~
## 6      6 Impfzentrum     Martins~ Martinst~ 1. Stock     1180 Währing Martinstr~
## # ... with 2 more variables: longitude <dbl>, latitude <dbl>
## # A tibble: 6 x 14
##   ï..Fach    Titel   Name   Vorname   PLZ Ordinationsadre~ Tel.nr. Details X    
##   <chr>      <chr>   <chr>  <chr>   <dbl> <chr>            <chr>   <chr>   <lgl>
## 1 Allgemein~ Assoc.~ Bohdj~ Arthur   1010 Kärntner Strass~ 890-40~ <NA>    NA   
## 2 Innere Me~ Priv.D~ Kikic  Zeljko   1010 Rathausstrasse ~ 470-61~ <NA>    NA   
## 3 Neurologi~ Dr.     Litta~ Gabor    1010 Sonnenfelsgasse~ 0660/8~ <NA>    NA   
## 4 Plastisch~ Dr.     Milani Shirin   1010 Schottengasse 7~ 236 13~ <NA>    NA   
## 5 Urologie   Univ.P~ Shari~ Shahro~  1010 Rathausstrasse ~ 470 61~ <NA>    NA   
## 6 Allgemein~ Dr.     Brandl Rainer   1020 Grosse Pfarrgas~ 890 24~ <NA>    NA   
## # ... with 5 more variables: PLZ_Adresse <chr>, location <chr>, lat_long <lgl>,
## #   lat <dbl>, longitude <dbl>

Umwandeln der DataFrames in sf-Objekte

# Umwandeln in sf-Objekt der Longitude und Latitude des Datensatzes
impfzentren_umw<-impfzentren_v2 %>%
  st_as_sf(coords=c("longitude", "latitude"), crs=4326)

# Umwandeln in sf-Objekt der Longitude und Latitude des Datensatzes
impf_ordination_umw<-impf_ordination %>%
  st_as_sf(coords=c("longitude", "lat"), crs=4326)

head(impf_ordination_umw)
## Simple feature collection with 6 features and 12 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: 16.35708 ymin: 48.20744 xmax: 16.38011 ymax: 48.21876
## Geodetic CRS:  WGS 84
## # A tibble: 6 x 13
##   ï..Fach    Titel   Name   Vorname   PLZ Ordinationsadre~ Tel.nr. Details X    
##   <chr>      <chr>   <chr>  <chr>   <dbl> <chr>            <chr>   <chr>   <lgl>
## 1 Allgemein~ Assoc.~ Bohdj~ Arthur   1010 Kärntner Strass~ 890-40~ <NA>    NA   
## 2 Innere Me~ Priv.D~ Kikic  Zeljko   1010 Rathausstrasse ~ 470-61~ <NA>    NA   
## 3 Neurologi~ Dr.     Litta~ Gabor    1010 Sonnenfelsgasse~ 0660/8~ <NA>    NA   
## 4 Plastisch~ Dr.     Milani Shirin   1010 Schottengasse 7~ 236 13~ <NA>    NA   
## 5 Urologie   Univ.P~ Shari~ Shahro~  1010 Rathausstrasse ~ 470 61~ <NA>    NA   
## 6 Allgemein~ Dr.     Brandl Rainer   1020 Grosse Pfarrgas~ 890 24~ <NA>    NA   
## # ... with 4 more variables: PLZ_Adresse <chr>, location <chr>, lat_long <lgl>,
## #   geometry <POINT [°]>

Erster Ansatz zur Berechnung der Impfstandorte in unmittelbarer Nähe zu Haltestellen des öffentlichen Verkehrs

Da das primäre Ziel des Projekts darin liegt die Anzahl an Haltestellen in einem gewissen Umkreis zu den Impfstandorten zu ermitteln, mussten Puffer um die Impfstandorte gebildet werden und nur jene Haltestellen zu dem jeweiligen Impfstandort hinzugezählt werden, die innerhalb des Puffers liegen.

Als Puffer wurde ein Durchmesser von 500 Meter gewählt. Diese Distanz, die sich auf den Luftliniendurchmesser bezieht, wurde aufgrund der Erkenntnisse eines Forschungspapers gezogen (https://www.sthelens.gov.uk/media/331745/cd-2229-wyg_how-far-do-people-walk.pdf). Dieses geht davon aus, dass Personen prinzipiell einen Fußweg von 400 Meter als angemessen empfinden. Da ein Durchmesser von 500 Meter einem Radius von 250 Metern entspricht, der allerdings eine Luftlinie betrachtet, wurde davon ausgegangen, dass ein Wert von 250 Meter Radius dem in etwa entsprechen dürfte.

Zur Veranschaulichung der Impfstandorte und Haltestellen innerhalb der Gemeindebezirke, mussten die entsprechenden Datensätze transformiert werden. Durch die Funktion st_transform erfolgt eine Transformation der Längen- und Breitengrade in ein zweidimensionales flaches Koordinatensystem. Bei der Nummer 31287 handelt es sich um die projizierten Koordinaten für Österreich.

Durch die Funktion st_buffer wird um jedes Impfzentrum ein Puffer von 500 Metern eingefügt.

# st_tranformation
bezirksgrenzen<-sf::st_read(dsn="Data/BEZIRKSGRENZEOGDPolygon.shp")
## Reading layer `BEZIRKSGRENZEOGDPolygon' from data source 
##   `C:\FHWn\S3\Analysetechniken\Projekt\Data\BEZIRKSGRENZEOGDPolygon.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 23 features and 15 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: 16.18183 ymin: 48.1179 xmax: 16.57751 ymax: 48.32267
## Geodetic CRS:  WGS 84
bezirksgrenzen.mgi <- st_transform(bezirksgrenzen, 31287)


impfzentren_umw.mgi <- st_transform(impfzentren_umw, 31287)

impf.puffer <- impfzentren_umw.mgi %>% st_buffer(dist = 500)

Nach den erfolgten Transformationen sowie dem Hinzufügen des Puffers konnten die Daten innerhalb der Bezirksgrenzen geplottet werden.

## Reading layer `OEFFHALTESTOGDPoint' from data source 
##   `C:\FHWn\S3\Analysetechniken\Projekt\Data\OEFFHALTESTOGDPoint.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 4763 features and 6 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: 16.18826 ymin: 48.12287 xmax: 16.54427 ymax: 48.31134
## Geodetic CRS:  WGS 84

Durch die Darstellung der mit Puffern versehenen Impfzentren innerhalb Wiens (dargestellt als blaue Punkte) im Vergleich zu den grün dargestellten Haltestellen, zeigt sich, dass dieser Ansatz Probleme mit sich bringt. Aufgrund der Größe der gewählten Puffer und das manche Impfzentren in unmittelbarer Nähe zu Bezirksgrenzen liegen, führte es zum Problem, dass durch eine solche Berechnung Haltestellen aus Nachbarbezirken zu den jeweiligen Standorten hinzugezählt werden würden. Ebenso offenbart es eine viel weitergehendere Problematik, nämlich die, dass wenn nun ein Impfzentrum in Bezirk A nahe zur Bezirksgrenze B liegt, jedoch eine höhere Dichte an Haltestellen im Bezirk B vorliegt, so würde dem Impfzentrum mit Standort im Bezirk A eine hohe Anzahl an Haltestellen zugerechnet werden, obwohl diese ausschließlich den Bezirk B betreffen. Durch die bessere Erreichbarkeit für Bewohner des Bezirks B würde gemäß unserer Annahme, dann das Impfzentrum primär Bezirksbewohner B ansprechen als Bewohner des Bezirks A. Somit würde es in diesem Fall mehr Sinn machen das Impfzentrum zum Standort B zuzuordnen bzw. eine Gewichtung vorzunehmen.

Zur Adressierung der Problematik wurde nach umfassender Überlegung entschlossen die Berechnung von der Anzahl an Haltestellen im Umkreis von 500 Metern zu Impfzentren zu der Anzahl an Impfzentren im Umkreis von 500 Metern der Haltestellen umzudrehen.

Somit wird nicht um jeden Impfstandort ein Puffer von 500 Meter gelegt, sondern um jede Haltestelle. Hierzu musste festgestellt werden in welchem Bezirk sich die in Summe 4763 Haltestellen jeweils befinden, um anschließend die Anzahl an Impfstandorte zu ermitteln, die im Umkreis von 500 Metern zu jeder der Haltestellen liegt.

Auch dieser Ansatz blieb leider nicht ohne der Notwendigkeit gewisse Annahmen sowie Verallgemeinerungen zu treffen. Diese können folgendermaßen zusammengefasst werden: - Keine der Haltestellen erhält eine Gewichtung. Dass heißt jede Haltestelle wird unabhängig von Größe oder Bedeutsamkeit gleich gewertet. Daher wird zum Beispiel der sehr zentral gelegene Hauptbahnhof Wien, der Haltestelle und Bahnhof für zahlreiche öffentliche Verkehrsmittel ist, nicht anders berücksichtigt, als eine x-beliebige Bushaltestelle.

  • Ähnlich wie bei Haltestellen, so werden auch Impfzentren als gleichwertig angenommen. Auch wenn durchaus davon auszugehen ist, dass das Austria Center im 22. Bezirk weit größere Menschenkapazitäten abfertigen kann als es im Stephansdom möglich ist. Andererseits ist erfahrungsgemäß die Frequentierung um den Stephansdom deutlich höher als an manch anderen Standorten, die hiermit ebenso unberücksichtigt bleibt.

  • Da sich neben den 24 Impfzentren auch 199 Privatordinationen in Wien befinden, wo Menschen eine Covid-19-Impfung erhalten, wurde zumindest hier eine klare Trennung der beiden Variablen entschieden. Statt von 223 Impfstandorten in ganz Wien auszugehen, wurde entschlossen die Anzahl an Impfzentren und die Anzahl an Privatordinationen bewusst in zwei Variablen aufzuteilen, da hier sehr wohl von einem Unterschied zwischen den jeweiligen Einrichtungen auszugehen ist. Eine Privatordination, die auch ihren regulären Betrieb bewältigen muss und nur “nebenbei” Personen impft kann bei weitem nicht dieselben Kapazitäten an Menschen impfen, wie es etwa das Austria Center in Wien tagtäglich bewältigt.

  • Die letzte Annahme berücksichtigt die oben bereits erläuterte Problematik beim ursprünglichen Ansatz, nämlich die Zuordnung der Impfzentren zu den jeweiligen Bezirken. Dadurch dass die Anzahl an Impfstandorten im Umkreis von 500 Metern zu jeder Haltestelle berechnet wird, bekommt jede Haltestelle einen gewissen Wert zugewiesen. Dieser Wert kann als “synthetisch” verstanden werden, da er nicht die reale Anzahl an Impfstandorten in Wien aufzeigt, aber dafür die Erreichbarkeit der Impfstandorte je Bezirk offenbart.

Zur Umsetzung unserer Ziele mussten folgende Schritte nacheinander abgearbeitet werden:

Schritt 1: Längen- und Breitengrad aus Spalte Geometry herausfiltern

Um jede Haltestelle dem jeweiligen Bezirk zuordnen zu können, wurde aus der Spalte “geometry” des Haltestellen-Datensatzes der Längen- und Breitengrad herausgefiltert und anschließend in seperate Spalten wieder eingefügt.

long_haltestelle<-c()
lat_haltestelle<-c()

for (i in 1:nrow(haltestelle_spez)) {
  g<-haltestelle_spez$geometry[[i]][1]
  h<-haltestelle_spez$geometry[[i]][2]
  long_haltestelle<-c(long_haltestelle, g)
  lat_haltestelle<-c(lat_haltestelle, h)
}

# In ein DataFrame einfügen
haltestellen_long_lat<-data.frame(long_haltestelle, lat_haltestelle)
head(haltestellen_long_lat)
##   long_haltestelle lat_haltestelle
## 1         16.37789        48.17502
## 2         16.36856        48.23522
## 3         16.35424        48.19203
## 4         16.36313        48.21514
## 5         16.30503        48.18755
## 6         16.31914        48.18599

Schritt 2: Haltestellen-Datensatz den jeweiligen Bezirk zuordnen

Nachfolgend wurde durch die Funktion st_as_sf das DataFrame in ein sf-Objekt konvertiert. Hierzu wurde die Variable haltestellen_long_lat, die die Längen- und Breitengrade enthält angeführt. Im Vektor des Parameters coords mussten die Spaltennamen der Variable angeführt werden und zuletzt unter crs das Koordinatenreferenzsystem der Bezirksgrenzen eingefügt werden.

Im Anschluss wurde in die Variable pnts die Bezirksnamen eingefügt. Hierzu wurde durch die Funktion st_intersects festgestellt, welcher Haltestellen-(Punkt) in welchem Bezirk liegt und der entsprechende Name eingefügt.

library(sf)
# Convert DF-Objekt in ein sf-Objekt
# st_crs: gibt das Koord-Referenzsystem von sf-Objekt zurück
pnts_sf <- st_as_sf(haltestellen_long_lat, coords = c('long_haltestelle', 'lat_haltestelle'), crs = st_crs(bezirksgrenzen))

# dem Datensatz mit allen Haltestellen die jeweiligen Bezirksnamen hinzufügen
pnts <- pnts_sf %>% mutate(intersection = as.integer(st_intersects(geometry, bezirksgrenzen)), area = if_else(is.na(intersection), '', bezirksgrenzen$NAMEG[intersection])) 

pnts
## Simple feature collection with 4763 features and 2 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: 16.18826 ymin: 48.12287 xmax: 16.54427 ymax: 48.31134
## Geodetic CRS:  WGS 84
## First 10 features:
##                     geometry intersection        area
## 1  POINT (16.37789 48.17502)           14   FAVORITEN
## 2  POINT (16.36856 48.23522)            9 BRIGITTENAU
## 3  POINT (16.35424 48.19203)           18  MARGARETEN
## 4  POINT (16.36313 48.21514)            5  ALSERGRUND
## 5  POINT (16.30503 48.18755)           20    HIETZING
## 6  POINT (16.31914 48.18599)           20    HIETZING
## 7  POINT (16.27621 48.19224)           20    HIETZING
## 8  POINT (16.37034 48.19392)           23      WIEDEN
## 9  POINT (16.39483 48.24641)           13 FLORIDSDORF
## 10 POINT (16.34428 48.22128)            5  ALSERGRUND

Schritt 3: Transformation Datensätze und Plotten der Haltestellen und Impfstellen

Ähnlich jenem Schritt der bereits in der ursprünglichen Überlegung zur Berechnung der Haltestellen innerhalb der Impfstandorte-Puffer benötigt wurde, benötigt es nun erneut eine Transformation der benötigten Datensätze auf das Referenzkoordinatensystem 31287, dass für Österreich steht. Durch die Funktion st_buffer wird nun allerdings den Haltestellen ein Puffer von jeweils 500 Metern zugewiesen.

bezirksgrenzen.mgi <- st_transform(bezirksgrenzen, 31287)

impfzentren_umw.mgi <- st_transform(impfzentren_umw, 31287)

haltestellen_long_lat.mgi<-st_transform(pnts, 31287)

# Puffer um die Haltestellen erzeugen

halte.puffer <- haltestellen_long_lat.mgi %>% st_buffer(dist = 500)

Nach der erfolgreichen Transformation können die aufbereiteten Daten zusammen geographisch dargestellt werden.

Jeder Haltestelle wurde ein teiltransparenter grüner Puffer zugewiesen. Die auf der Karte verteilten größeren blauen Punkte geben die insgesamt 24 Impfzentren, während die kleineren schwarzen Punkte die insgesamt 199 Privatordinationen innerhalb Wiens darstellen.

# darstellen Wiener-Bezirksgrenzen
a <- tm_shape(bezirksgrenzen.mgi)
a <- a + tm_borders()
# Puffer um die Impfzentren von 500m
# Puffer Teiltransparent dargestellt, damit die Bezirksgrenzen ersichtlich bleiben
a <- a + tm_shape(halte.puffer) + tm_polygons(col="green", alpha=0.1)
a <- a + tm_shape(haltestellen_long_lat.mgi) + tm_dots(col="green", size=0.001, alpha=0.1)
a <- a + tm_shape(impfzentren_umw) + tm_symbols(col="blue", size=1, alpha=0.5)
a <- a + tm_shape(impf_ordination_umw) + tm_dots(col="black", size=0.2)
# Darstellen von Titel 
a<- a + tm_layout(legend.position = c("right", "top"), legend.show = FALSE,
              title= 'Umkreis 500m zu Wiener-Haltestellen', title.size = 3,
              title.position = c('right', 'top'), legend.outside.position = TRUE, legend.title.color="black" )
a

Schritt 4: Abstände jede Haltestelle zu Impfstellen in 4763x24 und 4763x199 Matrizen

Der entscheidende Schritt zur Berechnung des gesuchten Prädiktors ergibt sich im wesentlichen durch eine einzige Funktion. Mittels st_distance wird der Abstand zwischen jeder Haltestelle zu dem jeweiligen Impfstandort ermittelt. Jeder dieser Abstände wird in der Unit-Einheit m, also Meter errechnet. Dadurch resultiert etwa für die Abstände zwischen den Haltestellen und den Impfzentren eine 4763x24 Matrix und für die Ordinationen eine 4763x199 Matrix. Die Abstände werden so dargestellt, dass jede Zeile eine Haltestelle und jede Spalte eine Ordination bzw. ein Impfzentrum repräsentiert.

# Abstände Impfzentren zu Haltestellen errechnet
distance_impfz2<-st_distance(haltestelle_spez, impfzentren_umw)

# Abstände Ordinationen zu Haltestellen
distance_ord<-st_distance(haltestelle_spez, impf_ordination_umw)

dim(distance_impfz2) # m Zeilen: 4763, n Spalten: 24 mit 114312 Elementen
dim(distance_ord) # m Zeilen: 4763, n Spalten: 199

Eine solche Matrix sieht nun bei den Ordinationen so aus:

## Rows: 4762 Columns: 1
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## chr (1): 3.632783e+03 [m] 4.608212e+03 [m] 3.862762e+03 [m] 4.348730e+03 [m]...
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
## # A tibble: 6 x 1
##   `3.632783e+03 [m] 4.608212e+03 [m] 3.862762e+03 [m] 4.348730e+03 [m] 4.608212~
##   <chr>                                                                         
## 1 3.097733e+03 [m] 2.500135e+03 [m] 2.883585e+03 [m] 2.515889e+03 [m] 2.500135e~
## 2 2.154665e+03 [m] 2.459914e+03 [m] 2.533715e+03 [m] 2.410390e+03 [m] 2.459914e~
## 3 1.072969e+03 [m] 4.638722e+02 [m] 1.113202e+03 [m] 2.517103e+02 [m] 4.638722e~
## 4 5.424977e+03 [m] 4.855747e+03 [m] 5.794272e+03 [m] 5.147109e+03 [m] 4.855747e~
## 5 4.577787e+03 [m] 4.201414e+03 [m] 4.957983e+03 [m] 4.424637e+03 [m] 4.201414e~
## 6 7.288262e+03 [m] 6.466346e+03 [m] 7.631044e+03 [m] 6.840511e+03 [m] 6.466346e~

Schritt 5: Feststellen, ob Impfstelle innerhalb des Umkreises liegt

Zwar wurden nun alle Abstände berechnet, allerdings sind die eigentlichen Distanzen nicht relevant, sondern nur die Frage, ob der jeweilige Impfstandort innerhalb des vorgebenen Umkreises liegt. Da die Abstände in Meter-Units angegeben waren, mussten die Elemente der Matrizen in numerische Werte umgewandelt werden. Dies wurde durch die Funktion as.numeric bewerkstelligt. Entscheidend sind schlussendlich zwei sehr einfache Zeilen Code. Durch nachfolgende Code-Zeilen: num_dist_copy[num_dist_copy <= 250] <- 1 num_dist_copy[num_dist_copy > 250] <- 0 wurde jeder Abstand, der kleiner gleich 250 Meter ist ein Wert 1 und jedem Wert darüber ein Wert 0 zugewiesen. Mittels rowSums wurde ausgehend vom letzten Schritt die Zeilensumme gebildet. In den Variablen rowSum_dist_impfzentrum und rowSum_dist_ord befanden sich nun die Anzahl an Impfzentren bzw. Privatordinationen für jede Haltestelle, die innerhalb des 500 Meter Umkreises liegen.

# Unit-Value in Numerische-Matrix umwandeln, damit damit weiter rechnen kann

# einmal für Impfzentren
numeric_distance_matrix <- matrix(as.numeric(distance_impfz2), ncol = 24) 

# einmal für die Impf-Ordinationen
numeric_distance_matrix_ord <- matrix(
  as.numeric(distance_ord), ncol = 199)

# Sicherheitskopien anfertigen
num_dist_copy<-numeric_distance_matrix
num_dist_ord_copy<-numeric_distance_matrix_ord
  
# konvertiere die Matrix indem 
# Werte <=500 als 1 und Werte > 250 als 0 ausgewiesen werden
num_dist_copy[num_dist_copy <= 250] <- 1
num_dist_copy[num_dist_copy > 250] <- 0

num_dist_ord_copy[num_dist_ord_copy <= 250] <- 1
num_dist_ord_copy[num_dist_ord_copy > 250] <- 0


#Zeilenweise Summe Anzahl Impfzentren je Haltestelle im Umkreis von 500m
rowSum_dist_impfzentrum<-rowSums(num_dist_copy, dims=1)
rowSum_dist_ord<-rowSums(num_dist_ord_copy, dims=1)

# Ergebnis als Spalte in Datensatz einfügen

haltestelle_spez2$Anzahl_Impfzentren<-rowSum_dist_impfzentrum # Anzahl_Impfzentren
haltestelle_spez2$Anzahl_Ordinationen<-rowSum_dist_ord

Schritt 6: Gruppierung nach Bezirken:

Zuletzt mussten nun nur noch die ermittelten Werte je Haltestelle auf Bezirksebene gruppiert werden. In den Variablen Impfzentren_group_Bezirk und Ordinationen_group_Bezirk finden sich schlussendlich die gesuchten Prädiktoren.

# gruppieren des Datensatzes nach Bezirksname sowie nach Anzahl an Impfzentren
Impfzentren_group_Bezirk<-haltestelle_spez2 %>% group_by(Bezirksname_only) %>% summarise(Freq=sum(Anzahl_Impfzentren))

Ordinationen_group_Bezirk<-haltestelle_spez2 %>% group_by(Bezirksname_only) %>% summarise(Freq=sum(Anzahl_Ordinationen))
## Simple feature collection with 6 features and 2 fields
## Geometry type: MULTIPOINT
## Dimension:     XY
## Bounding box:  xmin: 16.18826 ymin: 48.12287 xmax: 16.54427 ymax: 48.29958
## Geodetic CRS:  WGS 84
## # A tibble: 6 x 3
##   Bezirksname_only  Freq                                                geometry
##   <chr>            <dbl>                                        <MULTIPOINT [°]>
## 1 ""                   0 ((16.47628 48.27528), (16.45157 48.28922), (16.44843 4~
## 2 "ALSERGRUND"         6 ((16.3563 48.23337), (16.35782 48.23559), (16.35803 48~
## 3 "BRIGITTENAU"       11 ((16.36534 48.23636), (16.36552 48.23746), (16.3651 48~
## 4 "D\xd6BLING"         0 ((16.36144 48.26985), (16.36788 48.26013), (16.36743 4~
## 5 "DONAUSTADT"        38 ((16.50216 48.17079), (16.52374 48.20804), (16.52296 4~
## 6 "FAVORITEN"        106 ((16.3593 48.18043), (16.35929 48.18043), (16.35939 48~

Deskriptive Auswertung der geographischen Daten

Nachdem die entsprechenden Vorarbeiten zur Prädiktorermittlung abgeschlossen sind, konnten die erhobenen Daten deskriptiv ausgewertet werden.

Darstellung aller Haltestellen im Umkreis zu Impfstellen (grün) vs. alle Haltestellen (blau)

Mittels nachfolgender Darstellung kann zunächst durch die blauen Punkte die Gesamtzahl an Haltestellen in Wien dargestellt werden. All jene Punkte, die grün hinterlegt worden sind, sind jene Haltestellen die einen Impfstandort (ein Impfzentrum oder eine Privatordination) im Umkreis von 500 Meter haben.

Es zeigt sich, eine besonders starke Grünverteilung insbesondere in den alten Bezirken, die südlich der Donau liegen. Je weiter außerhalb der Bezirkenzentren, desto weniger Haltestellen und damit auch weniger Haltestellen in unmittelbarer Nähe zu den Impfstandorten sind festzustellen.

Anzahl Haltestellen gesamt vs. Anzahl Haltestellen die Impfstellen im Umkreis von 500m vorweisen

Zur besseren Nachvollziehbarkeit der Anzahl an Haltestellen und jener Haltestellen, die im Umkreis von 500 Meter zu einem Impfstandort liegen, wurde folgende zwei Barcharts dargestellt.

Wie nachfolgend zu sehen ist, wird hier die Anzahl an Haltestellen im Umkreis von 500 Meter zu einem Impfstandort je Bezirk dargestellt. Klarer Gewinner ist in diesem Fall Favoriten gefolgt von Donaustadt, Meidlung und der Inneren Stadt. An den letzten Stellen finden sich Josefstadt, Mariahilf und Hernals.

Vergleicht man nun die Werte mit der Gesamtzahl an Haltestellen, die je Bezirk vorliegen, so sind die Top 3 Bezirke: Donaustadt, Liesing und Favoriten. Mariahilf, Josefstadt und Neubau sind dieses Mal jene Bezirke mit den wenigsten Haltestellen insgesamt.

Vergleich der Haltestellen gesamt vs. der Haltestellen innerhalb des 500 Meter Umkreises zu Impfstandorten vs. der Differenz

In diesem Barchart werden die Unterschiede zwischen den zuvor gezeigten Barcharts aufgezeigt. Erneut steht jeder einzelne Balken für einen Bezirk, wie er auf der X-Achse angeführt wird und die Y-Achse gibt die Anzahl an Haltestellen an. Nun zeigt sich, wie sich die zwei Parameter, nämlich die Gesamtzahl an Haltestellen zu jenen Haltestellen die ein Impfstandort in der Nähe haben, im Verhältnis verhalten.

Betrachtet man hierzu beispielweise den Bezirk Donaustadt, so zeigt sich, dass es eine große Diskrepanz zwischen der Gesamtzahl an Haltestellen im Vergleich zu den Haltestellen in der Nähe zu Impfstandorten gibt. So hat jener Bezirk etwa 750 Haltestellen, aber nicht einmal 200 die in unmittelbarer Nähe zu Impfstandorten liegen. Vergleicht man dies zu kleineren Bezirken mit weniger Haltestellen besitzen, so ist dieses Missverhältnis weit geringer oder teilweise bei fast Null.

Karten der räumlichen Daten

Notwendige Libraries

Für die Erstellung der Karten haben wir folgenden Libraries verwendet:

  • sf (Simple Features): Spezifikation des “Open Geospatial Consortium” welche eine allgemein gültige Architektur für geogradische Daten und deren Geometrie definiert. Das Paket beinhaltet unterschiedliche Klassen wie Punkte, Linien, Polygone sowie verschiedene Multi-Klassen. Über die Klassen ermöglicht sf verschiedene räumliche Operatoren.

  • RColorBrewer: Enthält Paletten und Farben die wir für unsere Plots verwendet haben. Wir haben auch die R-ColorBrewer Website (https://colorbrewer2.org/) für Farben und Paletten benutzt.

  • tmap (Thematic Maps): R-Paket der Usern ermöglicht diverse Darstellungen der geographischen Daten.

  • raster: R-Paket der für Lesen, schreiben, Veränderung und Analisierung von verschiedenen geographischen Klassen und Daten ermöglicht.

Wien Visiten(Karte)

Wien ist die Bundeshauptstadt der Republik Österreich und zugleich eines der neuen österreichichen Bundesländer. In Wien wohnen fast 2 Mio Einwohner. Die Gesamtfäche von Wien ist 414.8 km^2, die auf 23 Wiener Gemeindebezirken aufgeteilt werden kann.

#In unserem "Wien Datenatz" waren die Wiener Bezirke nicht gut "lesbar" da die Umlaute nicht richtig erkannt wurden und deswegen
#müssten wir eine Liste von Wiener Bezirken erstellen.
Dis_Label<-c("Innere Stadt","Leopoldstadt","Landstraße","Wieden","Margareten","Mariahilf", "Neubau", "Josefstadt","Alsergrund","Favoriten","Simmering","Meilding","Penzing","Rudolfsheim-Fünfhaus","Ottakring","Hernals","Währing","Döbling","Florisdorf","Donaustadt","Liesing")

#km2 wird für Legende Titel benutzt. Hier haben wir mit "Regex" die richtige Schriftweise ermöglicht.
km2 <- expression("Fläche (m"^2*")")
 
#tmap_mode ist eine Methode, die uns interaktive und "normale" Plots ermöglicht. Mögliche Auspregungen sind "view" für interaktive und "plot" für statische Grafiken. 
tmap_mode("plot")
## tmap mode set to plotting
#Für Bezirksgrenzen und Wien "High-Level" Kennzahlen wie (Fläche, Bezirknummer...) haben wir wien_bez benutzt.
wien_bez <- readRDS(file = "wien_bez.rds")

#wien_bez ist class sf DataFrame mit 23 Features (1 Feature für 1 Wiener Bezirk) und 15 Felder. 
wien_bez
## Simple feature collection with 23 features and 15 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: 16.18183 ymin: 48.1179 xmax: 16.57751 ymax: 48.32267
## Geodetic CRS:  WGS 84
## First 10 features:
##            NAMEK BEZNR BEZ_RZ         NAMEK_NUM           NAMEK_RZ        NAMEG
## 1  Landstra<df>e     3    III 3., Landstra<df>e III. Landstra<df>e  LANDSTRASSE
## 2     Josefstadt     8   VIII    8., Josefstadt   VIII. Josefstadt   JOSEFSTADT
## 3   Innere Stadt     1      I  1., Innere Stadt    I. Innere Stadt INNERE STADT
## 4      Ottakring    16    XVI    16., Ottakring     XVI. Ottakring    OTTAKRING
## 5     Alsergrund     9     IX    9., Alsergrund     IX. Alsergrund   ALSERGRUND
## 6   Leopoldstadt     2     II  2., Leopoldstadt   II. Leopoldstadt LEOPOLDSTADT
## 7     W<e4>hring    18  XVIII   18., W<e4>hring  XVIII. W<e4>hring   W<c4>HRING
## 8        Hernals    17   XVII      17., Hernals      XVII. Hernals      HERNALS
## 9    Brigittenau    20     XX  20., Brigittenau    XX. Brigittenau  BRIGITTENAU
## 10       Penzing    14    XIV      14., Penzing       XIV. Penzing      PENZING
##     LABEL BEZ DISTRICT_C STATAUSTRI STATAUSTR0  FLAECHE   UMFANG AKT_TIMEST
## 1    III.  03       1030        903      90301  7403077 13962.28 2021-09-14
## 2   VIII.  08       1080        908      90801  1089946  4170.30 2021-09-14
## 3      I.  01       1010        901      90101  2868774  6972.75 2021-09-14
## 4    XVI.  16       1160        916      91601  8673048 18371.08 2021-09-14
## 5     IX.  09       1090        909      90901  2967385  7919.54 2021-09-14
## 6     II.  02       1020        902      90201 19241996 27093.08 2021-09-14
## 7  XVIII.  18       1180        918      91801  6347196 18058.47 2021-09-14
## 8   XVII.  17       1170        917      91701 11396335 29407.73 2021-09-14
## 9     XX.  20       1200        920      92001  5710474 11659.89 2021-09-14
## 10   XIV.  14       1140        914      91401 33760282 40196.94 2021-09-14
##    SE_SDO_ROW                       geometry
## 1       10889 POLYGON ((16.39662 48.20739...
## 2       10890 POLYGON ((16.34915 48.21516...
## 3       10891 POLYGON ((16.37264 48.21662...
## 4       10892 POLYGON ((16.27621 48.22704...
## 5       10893 POLYGON ((16.36165 48.23192...
## 6       10894 POLYGON ((16.40345 48.23192...
## 7       10895 POLYGON ((16.29502 48.24961...
## 8       10896 POLYGON ((16.28516 48.2568,...
## 9       10897 POLYGON ((16.37361 48.26127...
## 10      10898 POLYGON ((16.20914 48.26411...
#Erst definieren wir die tm_shape() methode wo wir die Wiener Bezirksgrenzen ploten.
#Dannach definieren wir mit tm_borders() die Bezirksgrenzen Linien-Breite und Linien Farbe. (White und 2px Breite)
#mit tm_fill stellen wir fest mit welcher Farbe wir die Grafik füllen wollen, in diesem Fall werden die Bezirke "Rot" und für labels benutzen wir die Labes aus dem 1. Schritt. Mit tm_layout() Methode geben wir mehr Informationen wie wir Titel, Legende, Hintergrund und solches gestallten wollen. 
wien<-tm_shape(wien_bez) + tm_borders(col = "white", lwd=2) + tm_fill(col="#de2d26", labels=Dis_Label,legend.format="fun") + tm_legend(position = c("right", "bottom"),bg.color="white") + tm_layout(title = "",title.bg.alpha=0.01,scale=0.9,title.size=3, bg.color="white",frame=FALSE,legend.outside=TRUE,legend.outside.position="top",legend.stack="vertical",legend.bg.color="#fc9272",title.bg.color="#fc9272")

#Hier Plotten wir "wien"
wien

Wien nach Fläche

In unserem Datensatz ist die Gesamtfläche von Wien 414,8 km^2 oder 414871018 m^2

sum(wien_bez$FLAECHE)
## [1] 414871018

Die größten Wiener Bezirke sind Florisdorf (XXI) und Donaustadt (XXII). Innere Wiener Bezirke, die sogennanten “Ring” und “Gürtel” Bezirke sind relativ zu den äußeren Bezirken kleiner.

#Legende Titel, mit Regex festgemacht um m^2 zu spezifieren. 
legend_title <- expression("Fläche (m"^2*")")

#Durch kombination v. tm_shape, tm_fill, tm_border werden die Wien Grenzen geplottet und mit tm_text tie Wiener Bezirke mit Römischen Zeichen beschriftet.
bez_m2<-tm_shape(wien_bez) + tm_fill(col="FLAECHE", title=legend_title) + tm_borders() + tm_text("LABEL", size=1/3)


bez_m2

Wiens Größter Bezirk

Donaustadt ist mit einer Fläche von 102,299km^2 der größte Wiener Gemeindebezirk.

#Hiermit stellen wir fest welcher Bezirk die größte Fläche hat
bez_gr<-wien_bez[wien_bez$FLAECHE==max(wien_bez$FLAECHE),]

#Hiermit Ploten wir diesen Bezirk und färben ihm mit Orange
plot(bez_gr[,1],col="#e6550d") 

#Um die Fläche in km^2 zu erhalten, müssen wir die m^2 Fläche mit 1e^6 dividieren.
Flaeche<-max(wien_bez$FLAECHE)/1000000

Flaeche
## [1] 102.2995

Um eine bessere Sicht zu ermöglichen, haben wir den größten Wiener Bezirk im Zusammenhang mit restlichen Wiener Bezirken geplottet und nur den Größten eingefärbt.

#Um beide Plots gemeinsam darzustellen haben wir erst Wien geplottet und mit reset=FALSE den Plot behalten.
plot(wien_bez[,3],reset=FALSE, col="white")

#Den zweiten plot haben wir auch geplottet und mit add=TRUE ihm auf ganz Wien Plot hinzugefügt.
plot(bez_gr,add=TRUE, col="#e6550d")
## Warning in plot.sf(bez_gr, add = TRUE, col = "#e6550d"): ignoring all but the
## first attribute

Wiens Kleinster Bezirk

Josefstadt ist mit einer Fläche von 1,09 km^2 der kleinste Wiener Gemeindebezirk.

#Diese Grafik haben wir gleich wie für den Größten Wiener Gemeindebezirk gemacht.


bez_kl<-wien_bez[wien_bez$FLAECHE==min(wien_bez$FLAECHE),]
plot(bez_kl[,1],col="#fee6ce") 

Josefstadt Fläche in km^2

Flaeche<-max(wien_bez$FLAECHE)/100000000
Flaeche
## [1] 1.022995
#Beide Plots zusammen (Josefstadt alleine und Josefstadt innerhalt von Wien)

plot(wien_bez[,3],reset=FALSE, col="white")
plot(bez_kl,add=TRUE, col="#fee6ce")

Bevölkerung pro Bezirk

Mit über 1,9 Millionen Einwohnern (etwa ein Fünftel der österreichischen Gesamtbevölkerung) ist Wien die bevölkerungsreichste Großstadt und Primatstadt Österreichs.

Westen, sowie Süden von Wien ist am meisten bewohnt, wobei Favoriten der bevölkerungsreichster Wiener Bezirk ist.

#Für weitere geographischen Plots benutzen wir die data_ges_geom Daten.
#in diesem SF DataFrame sind gibt es 23 Features (Wiener Bezirke) und 50 Felder. Diese 50 Felder sind alle demographische und sozio-ökonomischen Daten enthalten. Die Entstehung dieser Daten wurde schon früher in Dokumentation erkärt. 
data_ges_geom <- readRDS(file = "data_ges_geom.rds")

#Zur Erinnerung so sieht der Datensatzt aus:
data_ges_geom
## Simple feature collection with 23 features and 50 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: 16.18183 ymin: 48.1179 xmax: 16.57751 ymax: 48.32267
## Geodetic CRS:  WGS 84
## First 10 features:
##    DISTRICT_CODE    0-18 m%    Ben_bis18  19-39 m%  40-64 m%     65+ m%
## 1          90100 0.05436401 0.0005436401 0.1037050 0.1526797 0.09627505
## 2          90200 0.52150727 0.0052150727 0.9821101 0.8879803 0.34235197
## 3          90300 0.38698382 0.0038698382 0.8391626 0.7740723 0.32471898
## 4          90400 0.12981434 0.0012981434 0.2973538 0.2894530 0.12442503
## 5          90500 0.21693279 0.0021693279 0.5584476 0.4748348 0.17277185
## 6          90600 0.10658275 0.0010658275 0.3191727 0.2764245 0.10710599
## 7          90700 0.11082095 0.0011082095 0.3195390 0.2727619 0.10543164
## 8          90800 0.08617663 0.0008617663 0.2706166 0.2089273 0.08696148
## 9          90900 0.15090067 0.0015090067 0.4397781 0.3184402 0.13865699
## 10         91000 1.12783076 0.0112783076 1.8173484 1.7681121 0.70521471
##       0-18 w%  19-39 w%  40-64 w%    65+ w% EDU_ALL EDU_LEH EDU_BMS EDU_AHS
## 1  0.05389310 0.1100884 0.1479706 0.1206577    8.65    9.51    7.53   15.70
## 2  0.48111361 0.9680351 0.8759459 0.4792823   20.76   18.62    7.49   11.70
## 3  0.36689164 0.8304246 0.8104894 0.4642655   16.51   16.63    8.16   12.58
## 4  0.12390180 0.3111149 0.2869938 0.1747078   12.57   12.35    6.37   14.29
## 5  0.21143884 0.5559361 0.4561554 0.2377052   21.54   17.26    7.06   13.17
## 6  0.09847263 0.3272828 0.2712445 0.1498019   13.31   13.76    6.75   14.61
## 7  0.10417588 0.3412532 0.2745932 0.1437324   10.67   11.31    6.07   14.36
## 8  0.08261864 0.2479082 0.2023346 0.1236402    9.98   10.83    6.74   14.95
## 9  0.14483116 0.4657829 0.3382707 0.1948523   11.53   11.25    6.52   14.23
## 10 1.05646165 1.6600120 1.7226431 0.9834182   32.75   27.08    9.36    8.76
##    EDU_BHS EDU_KOL EDU_ACA EDU_UNI INC_TOT_VALUE INC_MAL_VALUE INC_FEM_VALUE
## 1     7.00    1.06    2.02   48.52         33256         39889         26266
## 2     6.91    0.91    1.75   31.86         22286         24349         19975
## 3     7.76    1.22    2.04   35.11         24172         26577         21614
## 4     7.51    1.13    1.91   43.87         25878         29397         22219
## 5     6.93    1.15    1.71   31.18         20479         21832         18972
## 6     7.30    1.19    1.87   41.20         23971         26700         21223
## 7     7.36    1.33    1.98   46.91         25100         27920         22355
## 8     6.87    1.15    2.19   47.30         25142         28198         22088
## 9     6.88    1.05    1.94   46.61         24701         27464         22029
## 10    6.99    0.73    1.24   13.10         19478         20761         17864
##    Bevölkerung TeilgeimpftePro100 VollimmunisiertePro100 ungültig%     oevp%
## 1        15867           71.88504               68.17924  75.95990 0.1783894
## 2       105237           67.14083               61.99341  69.78909 0.5080554
## 3        93248           70.72216               66.18373  72.75799 0.4433084
## 4        33075           70.62434               66.37944  75.80724 0.3913894
## 5        54373           67.95652               62.95956  70.59942 0.3351595
## 6        31336           72.62254               68.65905  74.05903 0.4258235
## 7        31683           73.96080               70.06597  77.98014 0.3535965
## 8        24365           71.77509               68.28237  79.99874 0.3854904
## 9        41812           72.94557               68.94432  76.45438 0.3712492
## 10      210573           63.53616               57.18112  64.01833 0.6836873
##       spoe%    fpoe%   gruene%     neos%     pilz%    kpoe%    wandl%     bpoe%
## 1  27.81176 12.63167  5.750934 14.160720 12.682637 2.200136 0.3058104 0.2208631
## 2  13.43338 19.25931  6.775186 19.779063  6.895514 2.112441 0.7236446 0.4194799
## 3  17.22825 17.33193  6.690739 19.067622  8.757128 2.313069 0.6345745 0.3878948
## 4  17.89139 15.61155  5.225049 22.910959 10.386497 2.617417 0.5968689 0.3571429
## 5  13.29359 18.84306  5.820174 21.279407  7.273606 2.433129 0.7573316 0.5381888
## 6  14.68846 15.71631  5.183300 25.197005  9.363223 2.603886 0.6460770 0.3915618
## 7  14.00823 15.11746  4.495035 29.275854 10.273674 3.351901 0.7410995 0.5328167
## 8  18.40243 14.42745  4.935541 26.036400 11.457280 3.222952 0.8404954 0.3981294
## 9  16.80190 14.99923  5.128598 24.525413 10.819810 2.709737 0.6889161 0.4286589
## 10 14.70521 23.57763 11.029365  7.967833  3.893093 1.570929 0.5129937 0.3140033
##    AGE_AVE         NAMEK BEZNR BEZ_RZ         NAMEK_NUM           NAMEK_RZ
## 1    47.45  Innere Stadt     1      I  1., Innere Stadt    I. Innere Stadt
## 2    39.92  Leopoldstadt     2     II  2., Leopoldstadt   II. Leopoldstadt
## 3    41.54 Landstra<df>e     3    III 3., Landstra<df>e III. Landstra<df>e
## 4    42.14        Wieden     4     IV        4., Wieden         IV. Wieden
## 5    40.33    Margareten     5      V    5., Margareten      V. Margareten
## 6    41.67     Mariahilf     6     VI     6., Mariahilf      VI. Mariahilf
## 7    41.16        Neubau     7    VII        7., Neubau        VII. Neubau
## 8    41.21    Josefstadt     8   VIII    8., Josefstadt   VIII. Josefstadt
## 9    40.47    Alsergrund     9     IX    9., Alsergrund     IX. Alsergrund
## 10   39.93     Favoriten    10      X    10., Favoriten       X. Favoriten
##           NAMEG LABEL BEZ DISTRICT_C STATAUSTRI STATAUSTR0  FLAECHE   UMFANG
## 1  INNERE STADT    I.  01       1010        901      90101  2868774  6972.75
## 2  LEOPOLDSTADT   II.  02       1020        902      90201 19241996 27093.08
## 3   LANDSTRASSE  III.  03       1030        903      90301  7403077 13962.28
## 4        WIEDEN   IV.  04       1040        904      90401  1776323  5634.81
## 5    MARGARETEN    V.  05       1050        905      90501  2011639  6342.24
## 6     MARIAHILF   VI.  06       1060        906      90601  1455044  5939.72
## 7        NEUBAU  VII.  07       1070        907      90701  1608248  5312.54
## 8    JOSEFSTADT VIII.  08       1080        908      90801  1089946  4170.30
## 9    ALSERGRUND   IX.  09       1090        909      90901  2967385  7919.54
## 10    FAVORITEN    X.  10       1100        910      91001 31822105 28695.45
##    AKT_TIMEST SE_SDO_ROW                       geometry
## 1  2021-09-14      10891 POLYGON ((16.37264 48.21662...
## 2  2021-09-14      10894 POLYGON ((16.40345 48.23192...
## 3  2021-09-14      10889 POLYGON ((16.39662 48.20739...
## 4  2021-09-14      10903 POLYGON ((16.36916 48.20071...
## 5  2021-09-14      10884 POLYGON ((16.35945 48.19662...
## 6  2021-09-14      10885 POLYGON ((16.36306 48.20183...
## 7  2021-09-14      10888 POLYGON ((16.33873 48.20854...
## 8  2021-09-14      10890 POLYGON ((16.34915 48.21516...
## 9  2021-09-14      10893 POLYGON ((16.36165 48.23192...
## 10 2021-09-14      10902 POLYGON ((16.38107 48.18807...
#Wir plotten mit tm_shape die Wiener Bezirksgrenzen und mit tm_polygon färben wir diese gemäß der Bevölkerung-Größe.
wien_pop<-tm_shape(data_ges_geom) + tm_polygons(col="Bevölkerung", palette="Purples", title="Bevölkerung in Wiener Bezirken") +tm_text("LABEL", size=1/2)

#Plotten
wien_pop

Bevölkerungsdichte in Wien

Um die Frage zu beantworten, welche Bezirke in Wien am dichtesten bewohnt sind, ist es notwendig zu zeigen wie viele Wiener pro m^2 in den jeweiligen Bezirken wohnen. Dies bewerkstelligen wir, indem wir die Anzahl der Bewohner (Bevölkerung) mit der Fläche dividieren.

#Um die Fragestellung zu beantworten haben wir eine neue Spalte hinzugefügt
#wir erstellen eine neue Spalte "drchn_pro_m2" und befüllen diese anhand zwei existierende Spalten "Bevölkerung" und "Fläche" (Bevölkerung dividiert durch Fläche)
data_ges_geom$drchn_pro_m2<-data_ges_geom$Bevölkerung/(data_ges_geom$FLAECHE)


# Wir plotten mit tn_shaoe die Wiener Grenzen und befüllen mit tm_polygons die Flächen mit der "Bevölkerungsdichte" Spalte.
wiener_pro_m2<-tm_shape(data_ges_geom) + tm_polygons(col="drchn_pro_m2", palette="Purples", title="Wiener pro m2") + tm_text("LABEL", size=1/2)


#Output
wiener_pro_m2

Durchschnittsalter pro Bezirk

Die ältesten Bezirke sind die “Innere Stadt” und “Hitzing wo das Durchschittsalter zwischen 46 und 48 Jahren liegt. Die jüngsten Wiener wohnen in Simmering wo das Durchnittsalter bei 39.29 Jahren liegt.

#Wir plotten mit tn_shape die Wiener Grenzen und befüllen mit tm_fill die Bezirke mit "AGE_AVE". Für die Choro-Grafik Füllung haben wir die R Brewer Palette "BuGn" genommen. Mit tm_borders haben wir die Wien Bezirksgrenzen mit weißer Farbe markiert und mit tm_text Methode haben wir die Flächen beschriftet.
wien_avg_age<-tm_shape(data_ges_geom) +tm_fill(col="AGE_AVE", n=5, palette="BuGn",title="Durchschnittsalter der Wiener") +tm_borders(col="white", lwd=2, lty=1) +tm_text("LABEL", size=1/2)


wien_avg_age

Bevölkerung nach Geschlecht

In Wien wohnen mehr Frauen als Männer. Dieses Verhältnis ist in den Bezirken Währing, Hernals, Hietzing, Liesing und Alsergrund am stärksten ausgeprägt. In nur einem Wiener Bezirk wohnen mehr Männer als Frauen und zwar in Rudolfsheim-Fünfhaus. Es ist wichtig zu sagen, dass in keinem Bezirk liegt eine Grupper deutlich im Vorsprung.

#data_ges_geom_v2 beinhaltet die % Verteilungen pro Bezirk zwischen Männer und Frauen
#die m und w Spalte haben wir mit merge Methode zu data_ges_geom_v2 hinzugefügt.
data_ges_geom_v2 <- readRDS(file = "data_ges_geom_v2.rds")


#Erst plotten wir die Männer Bezirke mit der üblicher Methode tm_shape für Wien Bezirke, tm_fill für CHoreopleth Füllung nach Spalte m/w und mit tm_text Beschriften wir die Bezirke
male_wien<-tm_shape(data_ges_geom_v2) + tm_fill(col="m", palette="Blues", title="% Männlich") +tm_text("LABEL", size=1/2) + tm_layout(legend.title.size=1,frame=FALSE)


#Das gleiche machen wir für Frauen Grafik
female_wien<-tm_shape(data_ges_geom_v2) + tm_fill(col="w",palette="RdPu" ,title="% Weiblich") +tm_text("LABEL", size=1/2) + tm_layout(legend.title.size=1,frame=FALSE)


# mit tmap_arrange Methode plotten wir beide Grafiken in einer Zeile.
tmap_arrange(male_wien,female_wien, ncol=2, nrow=1)

Bevölkerung nach Alter

Die Bevölkerungsgruppe 65 und älter ist am häufigsten in Donaustadt und Favoriten vertreten. Die Bevölkerungsgruppe 0-18 Jahren ist ebenfalls am häufigstens in Favoriten und Donaustadt vertreten.

Die Gruppe von Menschen zwischen 19 und 39 Jahren sind am häufigsten in Favoriten vertreten.

#Für die Darstellung, benutzen wir die data_ges_geom_v2 Daten.

#Wir zählen die jeweiligen Frauen und Männer Gruppen zusammen. 
data_ges_geom_v2$'0_18g'<-data_ges_geom_v2$`0-18 m%`+data_ges_geom_v2$`0-18 w%`
data_ges_geom_v2$'19_39g'<-data_ges_geom_v2$`19-39 m%`+data_ges_geom_v2$`19-39 w%`
data_ges_geom_v2$'40_64g'<-data_ges_geom_v2$`40-64 m%`+data_ges_geom_v2$`40-64 w%`
data_ges_geom_v2$'65+g'<-data_ges_geom_v2$`65+ m%`+data_ges_geom_v2$`65+ w%`



#Wir definieren die Grafiken für alle Gruppen mit der üblicher tm_shape, tm_fill und tm_borders Methoden.
bev_alt18<-tm_shape(data_ges_geom_v2) + tm_fill(col ='0_18g', palette="PuBuGn" ) + tm_borders(col="white", lwd=2)+tm_text("LABEL", size=1/2)
bev_alt39<-tm_shape(data_ges_geom_v2) + tm_fill(col ='19_39g' , palette="YlOrRd") + tm_borders(col="black", lwd=2)+tm_text("LABEL", size=1/2)
bev_alt64<-tm_shape(data_ges_geom_v2) + tm_fill(col ='40_64g' , palette="YlGnBu") + tm_borders(col="white", lwd=2)+tm_text("LABEL", size=1/2)
bev_alt65<-tm_shape(data_ges_geom_v2) + tm_fill(col ='65+g' , palette="YlOrBr") + tm_borders(col="black", lwd=2)+tm_text("LABEL", size=1/2)



#Mit tmap_arrange plotten wir alle Grafiken zusammen in zwei Spalten und zwei Zeilen.
tmap_arrange(bev_alt18,bev_alt65,bev_alt39,bev_alt64, nrow=2, ncol=2)

Bevölkerung nach Bildungsniveau

Uni-AbsolventInnen sind in den inneren Bezirken am stärksten vertreten. In Donaustadt leben die meisten BHS und BMS Absolventinnen. Wenn es um die Lehre-AbsolventInnen geht, hat Simmering einen klaren Vorsprung. In dem 10. Wiener Gemeindebezirk, Favoriten, haben die Bewohner am meisten einen Pflichtschulabschluss.

#Für die Darstellung benutzen wir die data_ges_geom_v3 welche die Bildungsdaten der Wiener Bevölkerung enthält.
data_ges_geom_v3 <- readRDS(file = "data_ges_geom_v3.rds")


#Mit tm_shape, tm_fill, tm_borders definieren wir Plots für alle Abschluss Gruppen der Wiener.
Wien_Bildung_UNI=tm_shape(data_ges_geom_v3) + tm_fill(col = "Universität", n=3, alpha=1, palette="Reds", title="Universität %") + tm_borders(col="Black", alpha=0.8)+tm_layout(legend.title.size=1,frame=FALSE)+tm_text("LABEL", size=1/2)

Wien_Bildung_AKD=tm_shape(data_ges_geom_v3) + tm_fill(col = "Akademie", n=3, alpha=1, palette="Oranges", title="Akademie %",frame = F, title.size = 100) + tm_borders(col="White", alpha=0.8)+tm_layout(legend.title.size=1,frame=FALSE)+tm_text("LABEL", size=1/2)

Wien_Bildung_KOL=tm_shape(data_ges_geom_v3) + tm_fill(col = "Kolleg", n=3, alpha=1, palette="Greens", title="Kolleg %",frame = F, title.size = 100) + tm_borders(col="White", alpha=0.8)+tm_layout(legend.title.size=1,frame=FALSE)+tm_text("LABEL", size=1/2)

Wien_Bildung_BHS=tm_shape(data_ges_geom_v3) + tm_fill(col = "BHS", n=3, alpha=1, palette="BuGn", title="BHS %",frame = F, title.size = 100) + tm_borders(col="White", alpha=0.8)+tm_layout(legend.title.size=1,frame=FALSE)+tm_text("LABEL", size=1/2)

Wien_Bildung_AHS=tm_shape(data_ges_geom_v3) + tm_fill(col = "AHS", n=3, alpha=1, palette="Blues", title="AHS %",frame = F, title.size = 100) + tm_borders(col="White", alpha=0.8)+tm_layout(legend.title.size=1,frame=FALSE)+tm_text("LABEL", size=1/2)

Wien_Bildung_BMS=tm_shape(data_ges_geom_v3) + tm_fill(col = "BMS", n=3, alpha=1, palette="PuBu", title="BMS %",frame = F, title.size = 100) + tm_borders(col="White", alpha=0.8)+tm_layout(legend.title.size=1,frame=FALSE)+tm_text("LABEL", size=1/2)

Wien_Bildung_Lehr=tm_shape(data_ges_geom_v3) + tm_fill(col = "Lehre", n=3, alpha=1, palette="RdPu", title="Lehre %",frame = F, title.size = 100) + tm_borders(col="White", alpha=0.8)+tm_layout(legend.title.size=1,frame=FALSE)+tm_text("LABEL", size=1/2)

Wien_Bildung_Pflicht=tm_shape(data_ges_geom_v3) + tm_fill(col = "Pflichtschule", n=3, alpha=1, palette="PuRd", title="Pflichtschule %",frame = F, title.size = 100) + tm_borders(col="White", alpha=0.8)+tm_layout(legend.title.size=1,frame=FALSE)+tm_text("LABEL", size=1/2)


#Mit tmap_arrange plotten wir alle Gruppen in einer 4x2 Matrix zusammen.
tmap_arrange(Wien_Bildung_UNI, Wien_Bildung_AKD, Wien_Bildung_KOL, Wien_Bildung_BHS, Wien_Bildung_AHS, Wien_Bildung_BMS, Wien_Bildung_Lehr, Wien_Bildung_Pflicht, nrow=4, ncol=2)

Bruttojahreseinkommen in Wien

Wenn es um Verdienst und Reichtum der Wiener geht, ist es notwendig zwischen Einkommen und Vermögen zu unterscheiden. Einkommen ist eine Stromgröße und bezeichnet das steuerpflichtigen Einkommen der Arbeitnehmer*Innen, wo das Vermögen eine Bestandsgröße ist und bezeichnet hingehen immaterielle und materielle Sachen, die die Bevölkerung besitzt.

Das höchste durchschnittliche Bruttojahreseinkommen in Wien gibt es in der Bezirk “Innere Stadt” gefolgt von den Ring-Bezirken, Donaustadt, Währing und Hietzing. Männer verdienen im Durchnitt mehr als Frauen in allen Bezirken. Das Einkommen von Frauen ist im Bezirk “Innere Stadt” und “Hietzing” am höchsten aber immerhin niedriger als das von Männern.

#Wir benutzen die data_ges_geom als Basis für die Darstellung

#Erst definieren wir die Grafik für Einkommen Total
inc_tot<-tm_shape(data_ges_geom) + tm_fill(col = "INC_TOT_VALUE", alpha=0.8, title="Durch. Bruttojahreseinkommen") + tm_borders(col="white", alpha=0.7, lwd=1.7, lty="11")+tm_text("LABEL", size=1/2)



#Danach definieren wir die Grafiken für Männer und Frauen mit tm_shape, tm_fill, tm_border und tm_text Methode.
inc_male<-tm_shape(data_ges_geom) + tm_fill(col = "INC_MAL_VALUE", alpha=0.8, title="Bruttojahreseinkommen der Männer", palette = "PuBu") + tm_borders(col="white", alpha=0.7, lwd=1.7, lty="11")+tm_text("LABEL", size=1/2)

inc_female<-tm_shape(data_ges_geom)+ tm_layout(title = '') + tm_fill(col = "INC_FEM_VALUE", alpha=0.8, title ="Bruttojahreseinkommen der Frauen", palette = "RdPu" , interactive = TRUE) + tm_borders(col="white", alpha=0.7, lwd=1.7, lty="11")+tm_text("LABEL", size=1/2)


#Total-Einkommen wird geplottet
inc_tot

#mit tmap_arrange plotten wir Männer und Frauen Einkommen nebeneinander.
tmap_arrange(inc_male,inc_female, ncol=2)

Wiener Bevölkerung nach politischer Einstellung (Nationalratswahl 2019)

Am 29.09.2019 fand die 27. Nationalratswahl in Österreich statt. Stimmenstärkste Partei wurde die ÖVP mit 37,5%. Auf dem zweiten Platz erhielt die SPÖ 21,2%. Mit 13,9% haben die Grünen das beste Nationalratsergebnis ihrer Geschichte erreicht.

Wien war nicht viel anders und die Wiener Bevölkerung hat die meisten Stimmen zu SPÖ gefolgt von ÖVP gegeben.

ÖVP Bezirken waren “Innere Stadt”, “Hietzing” und “Währing” SPÖ Bezirken waren “Favoriten”, “Simmering” und “Brigittenau” Die Grünen haben die meisten Stimmen in den “Ring Bezirken” und gewonnen haben sie auch in Neubau.

#Wir haben als Basis für diese Darstellung data_ges_geom_v4 benutzt. Diese Version beinhaltet die richtige Werte für die NRW2019. 
data_ges_geom_v4 <- readRDS(file = "data_ges_geom_v4.rds")


# Um herauszufinden wo die jeweilige Parteien die meisten Stimmen erzielt haben, war es notwendig für die 4 stärksten Parteien einen Plot zu machen befüllt nach % der gewonnen Stimmen. Wir haben die ÖVP, SPÖ, FPÖ und Grünen Grafiken anhand tm_border, tm_fill, tm_borders und tm_text definiert.


Wien_ÖVP<-tm_shape(data_ges_geom_v4) +tm_fill(col="ÖVP", title="ÖVP %",palette = "YlGnBu") + tm_borders(col="White", alpha=0.8)+tm_text("LABEL", size=1/2)+tm_layout(legend.title.size=1,frame=FALSE)


Wien_SPÖ<-tm_shape(data_ges_geom_v4) +tm_fill(col="SPÖ", title="SPÖ %",palette = "Reds") + tm_borders(col="White", alpha=0.8)+tm_text("LABEL", size=1/2)+tm_layout(legend.title.size=1,frame=FALSE)


Wien_GRUE<-tm_shape(data_ges_geom_v4) +tm_fill(col="GRÜNE", title="GRÜNE %",palette = "Greens") + tm_borders(col="White", alpha=0.8)+tm_text("LABEL", size=1/2)+tm_layout(legend.title.size=1,frame=FALSE)


Wien_FPÖ<-tm_shape(data_ges_geom_v4) +tm_fill(col="FPÖ", title="FPÖ %",palette = "Blues") + tm_borders(col="White", alpha=0.8)+tm_text("LABEL", size=1/2)+tm_layout(legend.title.size=1,frame=FALSE)



#Mit tmap_arrange haben wir alle Grafiken zusammen in einer Matrix der Form 2x2 dargestellt.
tmap_arrange(Wien_ÖVP,Wien_SPÖ,Wien_GRUE,Wien_FPÖ, nrow=2,ncol=2)

Wiener Linien Anzahl an Haltestellen pro Raster

Für uns war es wichtig zu sehen, wie die Wiener Linien Haltestellen über Wien verteilt sind. Wir wollten sehen, in welchen Regionen von Wien gibt es die meisten Haltestellen. In der Grafik kann man sehen, dass in Bezirken die in der Mitte von Wien liegen die höchste Anzahl an Haltestellen vorweisen. Je mehr man sich nach außen bewegt, desto weniger werden die Haltestellen. Mit roten Punkten haben wir die Impfzentren gemappt. Die Impfzentren überlappen sich mit den Rastern die größere Anzahl an Rastern vorzeigen können.

#Als Input Datei benutzen wir die Wiener Linien Haltestellen. Wir brauchen die Punkte aus dieser Datei.
wl <- readRDS(file = "wl.rds")

#Der DS beinhaltet 4763 Feutures (Haltestellen) und 6 Felder. Wie schon Angemerkt ist die Geometry "Punkt"
wl
## Simple feature collection with 4763 features and 6 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: 16.18826 ymin: 48.12287 xmax: 16.54427 ymax: 48.31134
## Geodetic CRS:  WGS 84
## First 10 features:
##    OBJECTID              HTXT             HTXTK HLINIEN DIVA_ID LTYP
## 1    472885      Reumannplatz      Reumannplatz      U1    1095    4
## 2    472886 J<e4>gerstra<df>e J<e4>gerstra<df>e      U6    1667    4
## 3    472887      Pilgramgasse      Pilgramgasse      U4    1018    4
## 4    472888       Schottentor       Schottentor      U2    1184    4
## 5    472889          Hietzing          Hietzing      U4     520    4
## 6    472890     Sch<f6>nbrunn     Sch<f6>nbrunn      U4    1211    4
## 7    472891   Ober Sankt Veit   Ober Sankt Veit      U4     956    4
## 8    472892  Taubstummengasse  Taubstummengasse      U1    1366    4
## 9    472893        Neue Donau        Neue Donau      U6    1668    4
## 10   472894  Michelbeuern-AKH  Michelbeuern-AKH      U6     874    4
##                     geometry
## 1  POINT (16.37789 48.17502)
## 2  POINT (16.36856 48.23522)
## 3  POINT (16.35424 48.19203)
## 4  POINT (16.36313 48.21514)
## 5  POINT (16.30503 48.18755)
## 6  POINT (16.31914 48.18599)
## 7  POINT (16.27621 48.19224)
## 8  POINT (16.37034 48.19392)
## 9  POINT (16.39483 48.24641)
## 10 POINT (16.34428 48.22128)
#Wir Laden die Impfstellen Punkte dazu. Um unsere Grafik besser zu gestalten.
wl_impf_halt <- readRDS(file = "wl_impf_halt.rds")
wien_impfstellen<-readRDS(file= "wien_impfstellen.rds")

#Hier machen wir den Wiener Linien Grundraster.

wl_raster<- raster(extent(wl), resolution = 0.01)

#Anzahl an Haltestellen pro Raster
wl_raster_anz <- rasterize(wl, wl_raster,
                              field = 1, fun = "count")





legend_title <- expression("Anzahl an Haltestellen pro Raster")
#Plot von Anzahl an Haltestellen pro Raster.
#Wir starten erst mit Wien Grenze
wien_rast_anzwl_impf <- tm_shape(wien_bez)
wien_rast_anzwl_impf <- wien_rast_anzwl_impf + tm_borders()
#Wir legen unseren Raster oberhalb von Wien
wien_rast_anzwl_impf <- wien_rast_anzwl_impf + tm_shape(wl_raster_anz) + tm_raster( title=legend_title)
#Danach legen wir die Punkte auf von Haltestellen über die vorige 2 Grafiken
wien_rast_anzwl_impf <- wien_rast_anzwl_impf + tm_shape(wien_bez) + tm_borders()

#Hiermit ploten wir alles zusammen
wien_rast_anzwl_impf

Impfzentren in Wien

Hier haben wir die Impfzentren-Punkte auf einer interaktiven Karte Wiens dargestellt.

# Mit der tmap_mode Methode entscheiden wir uns für eine Interaktive Grafik.
tmap_mode("view")
## tmap mode set to interactive viewing
#tif_sf enthält alle long und lat Koordinaten von Wiener Impfstellen
tif_sf<-readRDS("tif_sf.RDS")

tif_sf
## Simple feature collection with 24 features and 8 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: 16.21712 ymin: 48.1373 xmax: 16.47231 ymax: 48.26871
## Geodetic CRS:  WGS 84
## # A tibble: 24 x 9
##    Nummer Impfstellen_Typ Name    Strasse   Zusatzinfo     PLZ Bezirk location  
##  *  <dbl> <chr>           <chr>   <chr>     <chr>        <dbl> <chr>  <chr>     
##  1      1 Impfzentrum     Karmel~ Karmelit~ 1. Stock      1020 Leopo~ Karmelite~
##  2      2 Impfzentrum     TownTo~ Thomas-K~ 2             1030 Lands~ Thomas-Kl~
##  3      3 Impfzentrum     Gesund~ Wienerbe~ <NA>          1100 Favor~ Wienerber~
##  4      4 Impfzentrum     Am Sch~ Am Schöp~ 11/R10        1120 Meidl~ Am Schöpf~
##  5      5 Impfzentrum     Gasgas~ Gasgasse~ Eingang: St~  1150 Rudol~ Gasgasse ~
##  6      6 Impfzentrum     Martin~ Martinst~ 1. Stock      1180 Währi~ Martinstr~
##  7      7 Impfzentrum     Gesund~ Karl-Asc~ <NA>          1210 Flori~ Karl-Asch~
##  8      8 Impfzentrum     Wasser~ Wasserma~ <NA>          1210 Flori~ Wasserman~
##  9      9 Impfzentrum     Sanatr~ Franz Jo~ 1/2. Stock    1210 Flori~ Franz Jon~
## 10     10 Impfzentrum     Schröd~ Bernoull~ Eingang: VH~  1220 Donau~ Bernoulli~
## # ... with 14 more rows, and 1 more variable: geometry <POINT [°]>


#mit tm_shape plotten wir die Wiener Bezirke, mit tm_borders() plotten wir Wiener Bezirksgrenzen und mit tm_basemap und server="OpenStreetMap" ermöglichen wir die interaktive Basemappe.
tm_shape(wien_bez)+tm_borders(col="red")+tm_shape(tif_sf)+tm_dots()+tm_basemap(server="OpenStreetMap",alpha=0.5)

Impfordinationen in Wien

Hier haben wir die Impfordinationen auf einer interaktiven Karte Wiens dargestellt. Wenn man auf die Punkte klickt, sieht man alle Informationen im Zusammenhang mit der Impfordination.

#taf_sf ist die Impfordination Datei
taf_sf<-readRDS("taf_sf.RDS")

taf_sf
## Simple feature collection with 199 features and 12 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: 12.15145 ymin: 48.12593 xmax: 16.52682 ymax: 53.94708
## Geodetic CRS:  WGS 84
## # A tibble: 199 x 13
##    ï..Fach   Titel   Name   Vorname   PLZ Ordinationsadre~ Tel.nr. Details X    
##  * <chr>     <chr>   <chr>  <chr>   <dbl> <chr>            <chr>   <chr>   <lgl>
##  1 Allgemei~ Assoc.~ Bohdj~ Arthur   1010 Kärntner Strass~ 890-40~ <NA>    NA   
##  2 Innere M~ Priv.D~ Kikic  Zeljko   1010 Rathausstrasse ~ 470-61~ <NA>    NA   
##  3 Neurolog~ Dr.     Litta~ Gabor    1010 Sonnenfelsgasse~ 0660/8~ <NA>    NA   
##  4 Plastisc~ Dr.     Milani Shirin   1010 Schottengasse 7~ 236 13~ <NA>    NA   
##  5 Urologie  Univ.P~ Shari~ Shahro~  1010 Rathausstrasse ~ 470 61~ <NA>    NA   
##  6 Allgemei~ Dr.     Brandl Rainer   1020 Grosse Pfarrgas~ 890 24~ <NA>    NA   
##  7 Allgemei~ MR Dr.  Dolhyj Gerald   1020 Weintraubengass~ 216-53~ <NA>    NA   
##  8 Orthopä~ Dr.     Lehner Alexan~  1020 Ausstellungsstr~ 728 61~ <NA>    NA   
##  9 Allgemei~ Dr.     Rasso~ Rahman   1020 Vorgartenstrass~ 729 77~ <NA>    NA   
## 10 Allgemei~ Dr.     Rodler Thomas   1020 Sellenygasse 5   890 15~ <NA>    NA   
## # ... with 189 more rows, and 4 more variables: PLZ_Adresse <chr>,
## #   location <chr>, lat_long <lgl>, geometry <POINT [°]>
#Mit tm_shape wien_bez plotten wir die Wien Bezirken und mit tm_borders die dazugehörige grenzen und mit einer Kombination von tm_shape und tm_dots geben wir die Impfordinationen als Punkte dazu.
tm_shape(wien_bez)+tm_borders(col="red")+tm_shape(taf_sf)+tm_dots()

Bevölkerung nach Impfstatus - Vollimmunisierte Pro 100 Einwohner (Stand November 2021)

Datenstand ist November 2021 Bezirke die am meisten Vollimmunisierte pro 100 Einwohner haben, sind die Wiener “Ring-Bezirke” und die Bezirke im Norden und Westen von Wien. Die Bezirke Favoriten, Simmering, Leopoldstadt und Brigitenau haben die niedrigste Anzahl an Vollimmunisierte pro 100 Einwohner.

#Hiermit ermöglichen wir interaktives Plotten
tmap_mode("view")
## tmap mode set to interactive viewing
#Mit der tm_map Methoden: tm_shape zeichnen wir Wiener Bezirke, mit tm_fill füllen wir die Wiener Polygone mit der Anzahl an Vollimunisierten pro 100 und mit tm_borders() zeichnen wir die Grenzen von Wiener Bezirken. Mit tm_basemap wir nehmen OpenStreetMape als die basismape für interaktives plotten.
vollimm<-tm_shape(data_ges_geom) +
  tm_fill("VollimmunisiertePro100",title="Vollimmunisierte Pro 100",alpha=0.575) +
  tm_borders() +
  tm_basemap(server="OpenStreetMap",alpha=0.5)

vollimm

Bevölkerung nach Impfstatus - Teilimmunisierte Pro 100 (Nov 2021)

Was für die Vollimunisierte pro 100 gilt, gilt auch für Teilimmunisierte (Teilgeinmpfte) pro 100.

#Hiermit ermöglichen wir Interaktives Plotten
tmap_mode("view")
## tmap mode set to interactive viewing
#Mit der tm_map Methoden: tm_shape zeichnen wir Wiener Bezirke, mit tm_fill füllen wir die Wiener Polygone mit der Anzahl an Teilgeimpften pro 100 und mit tm_borders() zeichnen wir die Grenzen von Wiener Bezirken. Mit tm_basemap wir nehmen OpenStreetMape als die basismape für interaktives plotten.
teilimm<-tm_shape(data_ges_geom) +
  tm_fill("TeilgeimpftePro100",title="Teilgeimpfte Pro 100",alpha=0.575, palette="Blues") +
  tm_borders() +
  tm_basemap(server="OpenStreetMap",alpha=0.5)

teilimm

Modellierung

Ausgehend von den Erkenntnissen der deskriptiven Auswertung bei den Impfzentren und privaten Impfordinationen wurden zunächst erste Versuche unternommen einen Zusammenhang zwischen den Größen darzustellen. Hierzu wurden die erhobenen Prädiktoren und die Zielgrößen gegeneinander geplottet. Weiters wurde durch simple lineare Modelle versucht Zusammenhänge zwischen den Größen festzustellen.

Simple statistische Auswertung der erhobenen Prädiktoren zu der Zielgröße Impfinzidenz

Nun kommen wir endlich zum Kern der Arbeit, nämlich der Frage, ob ein Zusammenhang zwischen den erhobenen Prädiktoren und der Höhe der Vollimmunisierten bzw. Teilgeimpften pro 100 Einwohner besteht.

Plotten von Impfinzidenz zu erhobenen Prädiktoren

Als erstes wurde die Anzahl an Privatordinationen je Bezirk (auf der X-Achse) im Vergleich zur Immunisierungsquote (auf der Y-Achse) im Scatterplot dargestellt. Grundsätzlich zeigt sich, dass die Verteilung der Teilgeimpften und der Vollimmuniserten nahezu gleich sind. Einzig ist der Wert der Teilgeimpften stets um ein paar Prozentpunkte höher.

Nichtsdestotrotz zeigt sich hier kein eindeutiger Zusammenhang zwischen den zwei Größen. Die Werte scheinen nahezu geradlinig verteilt zu sein. Es zeigt sich auf den ersten Blick kein eindeutiger Trend der dafür spricht, dass eine höhere Anzahl an Ordinationen auch mit einer höheren Immunisierungsquote einhergeht.

Anzahl Impfzentren pro Bezirk zu Impfquote

Als nächstes wurde die Anzahl an Impfzentren je Bezirk (auf der X-Achse) im Vergleich zur Immunisierungsquote (auf der Y-Achse) im Scatterplot dargestellt. Ähnlich wie zuvor ist wieder kein klarer Trend erkennbar. Es scheint keinen klaren Zusammenhang zwischen der Anzahl an Impfzentren je Bezirk und der Immunisierungsquote zu geben.

Anzahl Impfzentrum-Haltestellen pro Bezirk zu Impfquote

In diesem Scatterplot wurde die Anzahl an Impfzentren im Umkreis von 500 Metern zu den Haltestellen je Bezirk (auf der X-Achse) im Vergleich zur Immunisierungsquote (auf der Y-Achse) im Scatterplot dargestellt. Es zeigt sich eine gewisse Linksverteilung. Die zwei Bezirke mit höherer Anzahl an Impfstellen zeigen keine klare Tendenz zu einer höheren bzw. niedrigeres Impfquote. Die Daten sind erneut sehr stark horizontal verteilt.

Anzahl Ordinations-Haltestellen pro Bezirk zu Impfquote

In diesem Scatterplot wurde die Anzahl an Privatordinationen im Umkreis von 500 Metern zu den Haltestellen je Bezirk (auf der X-Achse) im Vergleich zur Immunisierungsquote (auf der Y-Achse) im Scatterplot dargestellt. Die Mehrzahl der Bezirke zeigen eine Anzahl an Ordinations-Haltestellen im Bereich zwischen 50 bis etwa 250.

Transformation der Daten

Nachdem ein simples Plotten der Daten in der ursprünglichen Form keinerlei Zusammenhang gezeigt haben, wurde nachfolgend versucht, ob durch verschiedene Transformationsverfahren nicht doch ein Zusammenhang festzustellen ist.

x-Achsen-Werte: Impfzentren-Haltestelle

Im ersten Plot links oben zeigen sich erneut die Daten ohne Verwendung einer Transformation. Bei der zweiten Darstellung rechts oben wird die Wurzel aus allen Daten auf der X-Achse gezogen. Es zeigt sich eine leichte Verschiebung der Daten nach rechts. Beim Plot mit dem Titel log-Transformation wurden die X-Werte mit dem Logarithmus transformiert. Dies führt erneut nur zu einer Rechtsverschiebung der Datenpunkte. Durch Transformation der X-Werte mittels Kehrwert werden die Mehrzahl der Datenpunkte an das linke Ende verschoben. Kurz zusammengefasst kann festgestellt werden, dass keine der gängigen Transformationen einen Trend oder Zusammenhang erkennen lässt. Die Daten wirken als ob diese rein zufällig verteilt sind.

y-Achsen-Werte: Vollimmunisiertepro100

Ähnlich dem vorherigen Beispiel wurde dieselbe Darstellung derselben 4 Plots mit drei verschiedenen Transformationen gewählt. Dieses Mal wurde jedoch der Y-Wert statt dem X-Wert entsprechend transformiert. Im Gegensatz zu einer X-Wert-Transformation scheint die Transformation der Y-Werte kaum Einfluss auf die Darstellung der Datenpunkte zu haben. Auch hier kann gefolgert werden, dass rein optisch keinerlei Zusammenhang ablesbar ist.

Multiple Lineare Regression trotz niedriger Korrelation

Nachdem das Plotten der Daten auf keinerlei Korrelation hindeutete, wurde im nächsten Schritt versucht, ob die Kombination mehrerer Prädiktoren möglicherweise Erklärungswert für die Zielvariablen liefern.

Die Verwendung aller vier Variablen ergab, dass zwar das Intercept sowie die Anzahl an Impfzentren (Anzahl_Impfz), die Anzahl an Haltestellen im Umkreis zu Impfzentren (Impf_Haltestellen) sowie die Anzahl an Haltestellen im Umkreis zu Ordinationen (Ord_Haltestellen) noch signifikant sind, nicht jedoch die Anzahl der Ordinationen je Bezirk (Anzahl_Ord).

Bei Verwendung der zwei vielversprechendsten Prädiktoren, nämlich Anzahl_Impfz und Impf_Haltestellen, zeigt sich in der Summary ein adjustiertes Bestimmtheitsmaß (adjusted R^2) von gerade einmal 0.297.

## 
## Call:
## lm(formula = VollimmunisiertePro100 ~ Anzahl_Impfz + Impf_Haltestellen + 
##     Ord_Haltestellen + Anzahl_Ord, data = Data_Gesamt)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -4.128 -2.385  0.083  2.001  5.088 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       68.77297    1.76777  38.904  < 2e-16 ***
## Anzahl_Impfz      -6.07121    1.62132  -3.745  0.00148 ** 
## Impf_Haltestellen  0.15280    0.04903   3.116  0.00596 ** 
## Ord_Haltestellen  -0.02624    0.01092  -2.402  0.02733 *  
## Anzahl_Ord         0.26487    0.21912   1.209  0.24237    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.124 on 18 degrees of freedom
## Multiple R-squared:  0.517,  Adjusted R-squared:  0.4096 
## F-statistic: 4.816 on 4 and 18 DF,  p-value: 0.008091
## 
## Call:
## lm(formula = VollimmunisiertePro100 ~ Anzahl_Impfz + Impf_Haltestellen, 
##     data = Data_Gesamt)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -6.428 -2.916  1.180  2.094  5.825 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       66.98896    1.12199  59.706  < 2e-16 ***
## Anzahl_Impfz      -5.13277    1.59477  -3.219  0.00431 ** 
## Impf_Haltestellen  0.11338    0.05041   2.249  0.03593 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.409 on 20 degrees of freedom
## Multiple R-squared:  0.3609, Adjusted R-squared:  0.297 
## F-statistic: 5.647 on 2 and 20 DF,  p-value: 0.01137

3-Dimensionale Darstellung der Multiplen Regression

Unter zur Hilfenahme des Packages Plotly, dass drei dimensionale Graphiken ermöglicht, konnte diese Form der multiplen Regression ebenfalls graphisch dargestellt werden. Wie jedoch zu sehen ist, besteht keinerlei linearer Zusammenhang zwischen den Variablen.

Schlussendlich kann damit festgestellt werden, dass die Zielvariablen Vollimmunisierte pro 100 Einwohner sowie Teilgeimpfte pro 100 Einwohner weder durch die Anzahl an Impfzentren, der Anzahl an Ordinationen, der Anzahl an Haltestellen im Umkreis von 500 Metern zu Impfzentren oder Ordinationen bestimmt werden können. Die Datenverteilung kann als nahezu randominisiert bezeichnet werden, weshalb eine weitere nähere Betrachtung dieser Prädiktoren als nicht zielführend zu betrachten ist.

Multiple Lineare Regression

Nach Feststellung, dass den zuvor benannten Prädiktoren keinerlei Erklärungswert zukommt, wurde in weiterer Folge durch ein Trial-und-Error-Verfahren versucht bei anderen Variablen einen Erklärungswert für die Zielgrößen zu finden. Nach zahlreichen Versuchen konnte eine multiple lineare Regression festgestellt werden, bei der EDU_ALL (der Anteil der Bevölkerung die höchstens einen Pflichtabschluss haben) sowie der Anteil an abgegebenen FPÖ-Stimmen in der Nationalratswahl 2019 als sehr gut geeignete Prädiktoren für das Modell festgestellt werden.

lm_Vollimmunisierte_result <- lm(VollimmunisiertePro100 ~ EDU_ALL + fpoe , data = Data_Gesamt)
summary(lm_Vollimmunisierte_result)
## 
## Call:
## lm(formula = VollimmunisiertePro100 ~ EDU_ALL + fpoe, data = Data_Gesamt)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.0335 -0.5662  0.2255  0.7879  1.7160 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 69.69430    2.11789  32.907  < 2e-16 ***
## EDU_ALL     -0.74134    0.08186  -9.056 1.63e-08 ***
## fpoe         0.50484    0.19332   2.611   0.0167 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.071 on 20 degrees of freedom
## Multiple R-squared:  0.9369, Adjusted R-squared:  0.9306 
## F-statistic: 148.4 on 2 and 20 DF,  p-value: 1.004e-12
# Intercept: 69.69430
# EDU_ALL: -0.74134
# fpoe: 0.50484

Auf Basis der Korrelationsmatrix zeigt sich im 3-D-Raum folgendes Bild:

Durch das Plotten der drei Variablen im dreidimensionalen Raum zeigt sich, dass von einer klaren Linearität zwischen den Werten ausgegangen werden kann.

Besteht möglicherweise eine Korrelation zwischen EDU_ALL und der FPÖ?

Auch wenn dies nicht Ziel der Arbeit ist, so wurde aus Interesse noch der Frage nachgegangen, ob der Variable “Anteil der Bevölkerung mit Pflichtabschluss” (EDU_ALL) dazu dienen kann andere Variablen zu bestimmen?

Durch die graphische Gegenüberstellung von EDU_ALL konnte eine positive Korrelation zu den Wahlergebnissen der FPÖ sowie eine negative Korrelation zu der Liste Pilz und der ÖVP erkannt werden.

## 
## Call:
## lm(formula = fpoe ~ EDU_ALL, data = Data_Gesamt)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.19193 -0.68028  0.09436  0.49359  2.84526 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 10.43342    0.72911   14.31 2.66e-12 ***
## EDU_ALL      0.38982    0.03609   10.80 4.95e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.209 on 21 degrees of freedom
## Multiple R-squared:  0.8474, Adjusted R-squared:  0.8402 
## F-statistic: 116.7 on 1 and 21 DF,  p-value: 4.947e-10

Lineares Korrelation zwischen den Variablen - Vollimmunisiert

Vollimmunisiert korreliert stark mit: Pflichtschule, Lehre, AHS, Kolleg, Akademie, Universität, Einkommen, SPÖ, NEOS.

Vollimmunisiert korreliert nicht stark mit: Impfzentren und Ordinationen!

Es scheint so als gäbe es auch Multikollinarität zwischen den unterschiedlichen Variablen, da diese auch eine erhöhte Korrelation untereinander haben, z.B. NOES und Universität.

Jedoch ist erkennbar, dass die Vollimmunisierten mit einigen Parametern stark korrelieren und wir deshalb eine lineare Regression anstreben.

# Data/Data_Gesamt_Vollimmunisiert.rds
Data_Gesamt_Vollimmunisiert <- readRDS(file = "Data_Gesamt_Vollimmunisiert.rds")
round(cor(Data_Gesamt_Vollimmunisiert$VollimmunisiertePro100, Data_Gesamt_Vollimmunisiert),2)
##      m0_18 m19_39 m40_64  m65 w0_18 w19_39 w40_64  w65 Pflichtschule Lehre
## [1,] -0.55  -0.17  -0.25 0.47 -0.52    0.1   0.38 0.51         -0.96 -0.66
##        BMS  AHS  BHS Kolleg Akademie Universität Einkommen_Total
## [1,] -0.29 0.72 0.37   0.86     0.82        0.77            0.82
##      Einkommen_Männer Einkommen_Frauen Bevölkerung VollimmunisiertePro100
## [1,]              0.8             0.88       -0.49                      1
##      ungültig  ÖVP   SPÖ   FPÖ GRÜNE NEOS Pilz   KPÖ Wandl   BPÖ
## [1,]    -0.63 0.43 -0.87 -0.58  0.37 0.85 0.51 -0.47 -0.42 -0.54
##      Impfzentren_pro_Bez_Proz Ordination_pro_Bez_Proz Durchschnitt_Alter
## [1,]                    -0.17                   -0.37                0.6
corrplot(cor(Data_Gesamt_Vollimmunisiert), order = 'hclust', addrect = 2,  type = 'lower')

Lineares Regressionsmodell Vollimmunisierte - Gesamtes Modell

Wir erstellen ein lineares Regressionsmodell mithilfe der Funktion lm mit den unten angeführten Parametern. Es wurden nicht alle Parameter miteinbezogen, da das Modell sonst nicht funktionieren würde (überall NAN Werte, z.B. bei GRÜNE).

Die F-Statistik weißt einen p-Wert knapp unter 0,5 auf, deshalb wäre dieses Modell verwertbar. Da die Freiheitsgrade aber unter er vorgegebenen Grenze sich befinden, wird dieses Modell verworfen.

Es stellt sich nun die Frage, gibt es noch ein besseres Modell?

## 
## Call:
## lm(formula = VollimmunisiertePro100 ~ m0_18 + m19_39 + m40_64 + 
##     m65 + w0_18 + w19_39 + w40_64 + Pflichtschule + Lehre + AHS + 
##     Kolleg + Akademie + Universität + Einkommen_Total + Einkommen_Männer + 
##     Einkommen_Frauen + Bevölkerung + ungültig + ÖVP + SPÖ + FPÖ, 
##     data = Data_Gesamt_Vollimmunisiert)
## 
## Residuals:
##    1. Innere Stadt    2. Leopoldstadt      3. Landstraße          4. Wieden 
##          0.0139953          0.0175450         -0.0908464         -0.0465548 
##      5. Margareten       6. Mariahilf          7. Neubau      8. Josefstadt 
##          0.0672033         -0.0693967          0.0757338         -0.0003448 
##      9. Alsergrund      10. Favoriten      11. Simmering       12. Meidling 
##          0.0186546          0.0012820          0.0166774          0.0903267 
##       13. Hietzing        14. Penzing 15. Rudolfsheim-F.      16. Ottakring 
##          0.0131552          0.0537152         -0.0015501         -0.0155154 
##        17. Hernals        18. Währing        19. Döbling    20. Brigittenau 
##         -0.0321529         -0.0157513          0.0224648         -0.0708971 
##    21. Floridsdorf     22. Donaustadt        23. Liesing 
##         -0.0077647          0.0152181         -0.0551970 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)
## (Intercept)       1.057e+02  9.053e+01   1.167    0.451
## m0_18             7.885e-01  8.387e-01   0.940    0.520
## m19_39           -2.015e+00  5.820e-01  -3.462    0.179
## m40_64            3.356e-01  8.734e-01   0.384    0.766
## m65              -3.227e+00  1.058e+00  -3.050    0.202
## w0_18            -5.928e+00  1.276e+00  -4.647    0.135
## w19_39            2.485e-01  6.398e-01   0.388    0.764
## w40_64           -1.671e+00  5.568e-01  -3.001    0.205
## Pflichtschule    -1.883e-01  2.000e-01  -0.942    0.519
## Lehre             1.329e+00  5.816e-01   2.284    0.263
## AHS              -1.168e+00  3.473e-01  -3.363    0.184
## Kolleg           -1.053e+00  2.011e+00  -0.523    0.693
## Akademie          8.965e+00  2.282e+00   3.928    0.159
## Universität       8.266e-01  3.661e-01   2.258    0.265
## Einkommen_Total  -1.231e-02  3.703e-03  -3.323    0.186
## Einkommen_Männer  6.361e-03  1.763e-03   3.609    0.172
## Einkommen_Frauen  5.809e-03  2.161e-03   2.688    0.227
## Bevölkerung       3.049e-06  6.668e-06   0.457    0.727
## ungültig         -9.076e+00  3.717e+00  -2.442    0.247
## ÖVP               4.633e-01  2.924e-01   1.585    0.358
## SPÖ               8.320e-01  3.064e-01   2.715    0.225
## FPÖ               2.529e-01  4.576e-01   0.553    0.679
## 
## Residual standard error: 0.2196 on 1 degrees of freedom
## Multiple R-squared:  0.9999, Adjusted R-squared:  0.9971 
## F-statistic:   359 on 21 and 1 DF,  p-value: 0.04159

Lineares Regressionsmodell Vollimmunisierte - stepAIC standardisiert

Die stepAIC Funktion lässt uns herausfinden, welche Variablen für unsere lineare Regression von größter Wichtigkeit sind, um unser Modell mit deutlich weniger unabhängigen Variablen darstellen zu können. Den Parameter scale setzen wir hierbei auf TRUE, damit die Variablen Z-skaliert werden und eine Rangfolge erkennbar ist. Wir lassen dabei das Modell in beide Richtungen laufen, also forward + backward, um das bestmöglichste Ergebnis zu erzielen.

Aus dem Modell lässt sich folgendes erkennen:

  • F-Statistik sehr signifikant! -> Null-Hypothese wird verworfen, Modell verwertbar
  • Das Modell kann die abhängige Variable zu 96% erklären (R² adjusted)
  • alle unabhängigen Variablen weisen einen signifikanten P-Wert auf, d.h. dass diese nicht zufällig sind.
  • Pflichtschule & Intercept sind am signifikantesten, gefolgt von Universität
  • Ergebnis: drei Variablen aus dem Bereich Bildung => größter Einflussfaktor
## 
## Call:
## lm(formula = VollimmunisiertePro100 ~ Pflichtschule + Universität + 
##     m40_64 + Kolleg, data = Data_Gesamt_Vollimmunisiert)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.10288 -0.58777  0.01101  0.44481  1.31776 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   86.38442    5.53559  15.605 6.64e-12 ***
## Pflichtschule -0.65076    0.07150  -9.102 3.73e-08 ***
## Universität   -0.12620    0.03271  -3.859  0.00115 ** 
## m40_64        -0.58414    0.24558  -2.379  0.02866 *  
## Kolleg         3.83877    1.66954   2.299  0.03368 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.777 on 18 degrees of freedom
## Multiple R-squared:  0.9701, Adjusted R-squared:  0.9635 
## F-statistic: 146.1 on 4 and 18 DF,  p-value: 1.85e-13

Lineares Regressionsmodell Vollimmunisierte - stepAIC standardisiert

Im Plot ist schön zu erkennen, dass die unabhängigen Variablen die abhängige Variable gut erklären. Die LOESS (Local Polynomial Regression Fitting) Linie nähert sich sehr gut an die Regressionsgerade an.

ggplot(Data_Gesamt_Vollimmunisiert, aes(y = VollimmunisiertePro100, x = (Pflichtschule * -0.65076 + Universität * -0.12620 + m40_64 * -0.58414 + Kolleg * 3.83877 + 86.38442))) +
  geom_point() +
  geom_smooth(method = 'lm', formula = y ~ x, color = "blue", se = FALSE)+
  geom_smooth(method = "loess", formula = y ~ x, se = FALSE, color = "red") +
  xlab("Unabhängige Variablen") + ylab("Vollimmunisierte")

Multikollinarität vom Modell überprüfen

Da bereits vorher angesprochen wurde, dass Multikollinaritäten vorkommen könnten, wollen wir diese für unser Modell noch einmal überprüfen. Dies geschieht mit dem VIF-Wert/VIF-Funktion.

Es ist zu erkennen, dass kein Prädikator über 10 oder unter 0,1 liegt, damit ist keine Multikollinarität für unser Modell gegeben.

vif(lm_Vollimmunisierte.bw)
## Pflichtschule   Universität        m40_64        Kolleg 
##      9.505136      5.726922      1.042004      3.149684

Diagnoseplots

Aus den Q-Q Plot ist zu erkennen, dass sich unser Modell einer Normalverteilung annähert. Des Weiteren ist am Plot “Residuals vs Leverage” zu erkennen, dass keiner unserer Beobachtungen außerhalb der Cook-Distanz liegt.

par(mfcol = c(2,2))
plot(lm_Vollimmunisierte.bw)

Prediction Vollimmunisierte - Repeated K-fold cross-validation

Mit unserem Modell wollen wir dann auch nochmals testen, ob es zur Vorhersage geeignet ist. Dabei haben wir uns für die k-fold Cross Validation entschieden, um die Güte unseres Vorhersagemodells bestimmen zu können.

Unser Datenset wird randomisiert und in 10 gleich große Gruppen gesplittet, dabei wird bei jedem Durchlauf eine Gruppe als Testgruppe ausgewählt und die anderen als Trainingsdaten. Das Ganze wird drei mal wiederholt.

Die Güte der Regression wird anhand der drei Kennzahlen RMSE, R² und MAE gemessen, dabei kommen diese zu dem folgendem Ergebnis:

  • RMSE: klein, gute Prognosegüte
  • R²: nahe 1, sehr gute Prognosegüte
  • MAE ebenfalls klein
# defining training control as
# repeated cross-validation and
# value of K is 10 and repetition is 3 times
trctrl <- trainControl(method = "repeatedcv", number = 10, savePredictions=TRUE, repeats = 3)

# training the model by assigning columns
# as target variable and rest other column
# as independent variable
nb_Vollimmunisiert_fit <- train(VollimmunisiertePro100 ~ Pflichtschule + Universität + m40_64 + Kolleg, data = Data_Gesamt_Vollimmunisiert, method = "lm", trControl=trctrl)

# printing model performance metrics
# along with other details
print(nb_Vollimmunisiert_fit)
## Linear Regression 
## 
## 23 samples
##  4 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold, repeated 3 times) 
## Summary of sample sizes: 20, 20, 21, 20, 21, 21, ... 
## Resampling results:
## 
##   RMSE       Rsquared   MAE      
##   0.8309619  0.9675241  0.7487259
## 
## Tuning parameter 'intercept' was held constant at a value of TRUE

Lineares Korrelation zwischen den Variablen - Teilgeimpfte

Teilgeimpft korreliert stark mit: Pflichtschule, Lehre, AHS, Kolleg, Akademie, Universität, Einkommen, SPÖ, NEOS.

Teilgeimpft korreliert nicht stark mit: Impfzentren und Ordinationen!

Es scheint so als gäbe es auch Multikollinarität zwischen den unterschiedlichen Variablen, da diese auch eine erhöhte Korrelation untereinander haben, z.B. NOES und Universität.

Jedoch ist erkennbar, dass die Teilgeimpft mit einigen Parametern stark korrelieren und wir deshalb eine lineare Regression anstreben.

Data_Gesamt_Teilgeimpft <- readRDS(file = "Data_Gesamt_Teilgeimpft.rds")
round(cor(Data_Gesamt_Teilgeimpft$TeilgeimpftePro100, Data_Gesamt_Vollimmunisiert),2)
##      m0_18 m19_39 m40_64  m65 w0_18 w19_39 w40_64 w65 Pflichtschule Lehre   BMS
## [1,] -0.51  -0.19  -0.26 0.47 -0.48   0.08   0.41 0.5         -0.94 -0.62 -0.25
##       AHS  BHS Kolleg Akademie Universität Einkommen_Total Einkommen_Männer
## [1,] 0.68 0.41   0.86     0.81        0.74            0.81             0.79
##      Einkommen_Frauen Bevölkerung VollimmunisiertePro100 ungültig  ÖVP   SPÖ
## [1,]             0.87       -0.45                      1    -0.59 0.44 -0.84
##        FPÖ GRÜNE NEOS Pilz   KPÖ Wandl   BPÖ Impfzentren_pro_Bez_Proz
## [1,] -0.54  0.34 0.82 0.49 -0.49 -0.42 -0.51                    -0.16
##      Ordination_pro_Bez_Proz Durchschnitt_Alter
## [1,]                   -0.36               0.59
corrplot(cor(Data_Gesamt_Teilgeimpft), order = 'hclust', addrect = 2,  type = 'lower')

Lineares Regressionsmodell Teilgeimpfte - Gesamtes Modell

Wir erstellen ein lineares Regressionsmodell mithilfe der Funktion lm mit den unten angeführten Parametern. Es wurden nicht alle Parameter miteinbezogen, da das Modell sonst nicht funktionieren würde (überall NAN Werte, z.B. bei GRÜNE).

Die F-Statistik weißt einen p-Wert knapp über 0,5 auf und die Freheitsgrade sind ebenfalls unter dem vorgegebenen Grenzwert, deshalb ist dieses Modell nicht verwertbar.

Es stellt sich nun die Frage, gibt es noch ein besseres Modell?

lm_Teilgeimpfte <- lm(TeilgeimpftePro100 ~ m0_18 + m19_39 + m40_64 + m65 + w0_18 + w19_39 + w40_64 + Pflichtschule + Lehre + AHS + Kolleg + Akademie + Universität + Einkommen_Total + Einkommen_Männer + Einkommen_Frauen + Bevölkerung + ungültig + ÖVP + SPÖ + FPÖ, data = Data_Gesamt_Teilgeimpft)
summary(lm_Teilgeimpfte)
## 
## Call:
## lm(formula = TeilgeimpftePro100 ~ m0_18 + m19_39 + m40_64 + m65 + 
##     w0_18 + w19_39 + w40_64 + Pflichtschule + Lehre + AHS + Kolleg + 
##     Akademie + Universität + Einkommen_Total + Einkommen_Männer + 
##     Einkommen_Frauen + Bevölkerung + ungültig + ÖVP + SPÖ + FPÖ, 
##     data = Data_Gesamt_Teilgeimpft)
## 
## Residuals:
##    1. Innere Stadt    2. Leopoldstadt      3. Landstraße          4. Wieden 
##          0.0151904          0.0190432         -0.0986039         -0.0505302 
##      5. Margareten       6. Mariahilf          7. Neubau      8. Josefstadt 
##          0.0729419         -0.0753226          0.0822008         -0.0003743 
##      9. Alsergrund      10. Favoriten      11. Simmering       12. Meidling 
##          0.0202475          0.0013914          0.0181015          0.0980398 
##       13. Hietzing        14. Penzing 15. Rudolfsheim-F.      16. Ottakring 
##          0.0142786          0.0583020         -0.0016825         -0.0168403 
##        17. Hernals        18. Währing        19. Döbling    20. Brigittenau 
##         -0.0348985         -0.0170963          0.0243831         -0.0769511 
##    21. Floridsdorf     22. Donaustadt        23. Liesing 
##         -0.0084278          0.0165176         -0.0599104 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)
## (Intercept)       1.646e+02  9.826e+01   1.675    0.343
## m0_18             6.097e-01  9.103e-01   0.670    0.624
## m19_39           -2.092e+00  6.317e-01  -3.311    0.187
## m40_64           -3.855e-01  9.479e-01  -0.407    0.754
## m65              -3.177e+00  1.148e+00  -2.767    0.221
## w0_18            -5.547e+00  1.385e+00  -4.006    0.156
## w19_39           -1.776e-01  6.944e-01  -0.256    0.841
## w40_64           -1.513e+00  6.043e-01  -2.503    0.242
## Pflichtschule    -2.494e-01  2.170e-01  -1.149    0.456
## Lehre             7.686e-01  6.313e-01   1.217    0.438
## AHS              -9.941e-01  3.770e-01  -2.637    0.231
## Kolleg           -1.109e+00  2.183e+00  -0.508    0.701
## Akademie          5.929e+00  2.477e+00   2.393    0.252
## Universität       4.632e-01  3.974e-01   1.166    0.451
## Einkommen_Total  -9.700e-03  4.019e-03  -2.413    0.250
## Einkommen_Männer  4.948e-03  1.913e-03   2.586    0.235
## Einkommen_Frauen  4.654e-03  2.346e-03   1.984    0.297
## Bevölkerung       7.087e-06  7.237e-06   0.979    0.507
## ungültig         -8.735e+00  4.034e+00  -2.165    0.275
## ÖVP               2.235e-01  3.173e-01   0.704    0.609
## SPÖ               5.019e-01  3.326e-01   1.509    0.373
## FPÖ               3.720e-01  4.966e-01   0.749    0.591
## 
## Residual standard error: 0.2384 on 1 degrees of freedom
## Multiple R-squared:  0.9998, Adjusted R-squared:  0.9947 
## F-statistic:   198 on 21 and 1 DF,  p-value: 0.05599

Lineares Regressionsmodell Teilgeimpfte - stepAIC standardisiert

Die stepAIC Funktion lässt uns herausfinden, welche Variablen für unsere lineare Regression von größter Wichtigkeit sind, um unser Modell mit deutlich weniger unabhängigen Variablen darstellen zu können. Den Parameter scale setzen wir hierbei auf TRUE, damit die Variablen Z-skaliert werden und eine Rangfolge erkennbar ist. Wir lassen dabei das Modell in beide Richtungen laufen, also forward + backward, um das bestmöglichste Ergebnis zu erzielen.

Aus dem Modell lässt sich folgendes erkennen:

  • F-Statistik sehr signifikant! -> Null-Hypothese wird verworfen, Modell verwertbar
  • Das Modell kann die abhängige Variable zu 95% erklären (R² adjusted)
  • alle unabhängigen Variablen weisen einen signifikanten P-Wert auf, d.h. dass diese nicht zufällig sind.
  • Pflichtschule & Universität & Intercept sind am signifikantesten
  • Ergebnis: drei Variablen aus dem Bereich Bildung => größter Einflussfaktor
# ausgeklammert von CHW
lm_Teilgeimpfte1 <- lm(TeilgeimpftePro100~1, data = Data_Gesamt_Teilgeimpft)
lm_Teilgeimpfte.bw <- stepAIC(lm_Teilgeimpfte1, direction = "both", trace = FALSE, scale = TRUE,
                scope=list(lower = lm_Teilgeimpfte1, upper = lm_Teilgeimpfte))
summary(lm_Teilgeimpfte.bw)
## 
## Call:
## lm(formula = TeilgeimpftePro100 ~ Pflichtschule + Universität + 
##     m40_64 + Kolleg, data = Data_Gesamt_Teilgeimpft)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.02078 -0.59773  0.02086  0.45462  1.13144 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   88.90704    5.22830  17.005 1.55e-12 ***
## Pflichtschule -0.53675    0.06753  -7.948 2.69e-07 ***
## Universität   -0.12368    0.03089  -4.004 0.000832 ***
## m40_64        -0.56987    0.23195  -2.457 0.024395 *  
## Kolleg         3.64361    1.57686   2.311 0.032909 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.7339 on 18 degrees of freedom
## Multiple R-squared:  0.959,  Adjusted R-squared:  0.9499 
## F-statistic: 105.2 on 4 and 18 DF,  p-value: 3.174e-12

Lineares Regressionsmodell Teilgeimpfte - stepAIC standardisiert

Im Plot ist schön zu erkennen, dass die unabhängigen Variablen die abhängige Variable gut erklären. Die LOESS (Local Polynomial Regression Fitting) Linie nähert sich sehr gut an die Regressionsgerade an.

# ausgeklammert von CHW
ggplot(Data_Gesamt_Teilgeimpft, aes(y = TeilgeimpftePro100, x = (Pflichtschule * -0.53675 + Universität * -0.12368 + m40_64 * -0.56987 + Kolleg * 3.64361 + 88.90704))) +
  geom_point() +
  geom_smooth(method = 'lm', formula = y ~ x, color = "blue", se = FALSE)+
  geom_smooth(method = "loess", formula = y ~ x, se = FALSE, color = "red") +
  xlab("Unabhängige Variablen") + ylab("Teilgeimpfte")

Multikollinarität vom Modell überprüfen

Da bereits vorher angesprochen wurde, dass Multikollinaritäten vorkommen könnten, wollen wir diese für unser Modell noch einmal überprüfen. Dies geschieht mit dem VIF-Wert/VIF-Funktion.

Es ist zu erkennen, dass kein Prädikator über 10 oder unter 0,1 liegt, damit ist keine Multikollinarität für unser Modell gegeben.

vif(lm_Teilgeimpfte.bw)
## Pflichtschule   Universität        m40_64        Kolleg 
##      9.505136      5.726922      1.042004      3.149684

Diagnoseplots

Aus den Q-Q Plot ist zu erkennen, dass sich unser Modell einer Normalverteilung annähert, jedoch etwas schlechter als bei den Vollimmunisierten. Des Weiteren ist am Plot “Residuals vs Leverage” zu erkennen, dass keiner unserer Beobachtungen außerhalb der Cook-Distanz liegt.

par(mfcol = c(2,2))
plot(lm_Teilgeimpfte.bw)

Prediction Teilgeimpfte - Repeated K-fold cross-validation

Mit unserem Modell wollen wir dann auch nochmals testen, ob es zur Vorhersage geeignet ist. Dabei haben wir uns für die k-fold Cross Validation entschieden, um die Güte unseres Vorhersagemodells bestimmen zu können.

Unser Datenset wird randomisiert und in 10 gleich große Gruppen gesplittet, dabei wird bei jedem Durchlauf eine Gruppe als Testgruppe ausgewählt und die anderen als Trainingsdaten. Das Ganze wird drei mal wiederholt.

Die Güte der Regression wird anhand der drei Kennzahlen RMSE, R² und MAE gemessen, dabei kommen diese zu dem folgendem Ergebnis:

  • RMSE: klein, gute Prognosegüte
  • R²: nahe 1, sehr gute Prognosegüte
  • MAE ebenfalls klein
# defining training control as
# repeated cross-validation and
# value of K is 10 and repetition is 3 times
trctrl <- trainControl(method = "repeatedcv", number = 10, savePredictions=TRUE, repeats = 3)

# training the model by assigning columns
# as target variable and rest other column
# as independent variable
nb__Teilgeimpft_fit <- train(TeilgeimpftePro100 ~ Pflichtschule + Universität + m40_64 + Kolleg, data = Data_Gesamt_Teilgeimpft, method = "lm", trControl=trctrl)

# printing model performance metrics
# along with other details
print(nb__Teilgeimpft_fit)
## Linear Regression 
## 
## 23 samples
##  4 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold, repeated 3 times) 
## Summary of sample sizes: 21, 21, 21, 21, 21, 20, ... 
## Resampling results:
## 
##   RMSE       Rsquared   MAE      
##   0.7574743  0.9679258  0.6713474
## 
## Tuning parameter 'intercept' was held constant at a value of TRUE

Resümee

Als Resümee kann geschlossen werden, dass sich die abhängigen Variablen Teilgeimpfte und Vollimmunisierte sehr gut durch eine lineare Regression mit den Prädiktoren Pflichtschule, Universität, männlich 40 - 64 Jahre und Kolleg erklären lassen.

Es gibt keine Hinweise, die darauf schließen lassen, dass es zwischem dem Modell der Vollimmunisierte und dem Modell der Teilgeimpften wesentliche Unterschiede gibt. Beide sind durch diesselben Variablen erklärbar und die Modelle weisen eine ungefähr gleich gute Güte auf.

Ebenso ist anzumerken, dass die geografischen Variblen keinen gute Erklärbarkeit für die Impfquote liefern können.